gpt4 book ai didi

c# - WPF 绑定(bind) - 标签绑定(bind)问题

转载 作者:行者123 更新时间:2023-12-03 10:54:43 25 4
gpt4 key购买 nike

我正在尝试使用 Async DataBinding ,这是因为我需要在我的应用程序上执行几个必须访问 UI 控件的线程。为此,我声明了 Label作为:

<Label x:Name="SyncRange" Content="{Binding NextSynchronization, IsAsync=True}" />

(注意这是我自己的控件),所以在控件的类中我定义了这个:
private string nextSync = "N/A";

public string NextSynchronization {
get {
return nextSync;
}
set {
nextSync = value;
}
}

如何查看 nextSync 的默认值是 N/A ,我可以从任何类中更改变量的值。
此时我已经以这种方式在我的 MainWindow 中导入了控件:
xmlns:OwnControl="clr-namespace:SynchronizationTool"

并将其用作:
<OwnControl:Scheduler x:Name="Scheduler"/>

在 MainWindow 类中,当我按下保存按钮时,我想在标签中显示一个新值,所以:
private void Save_Click(object sender, RoutedEventArgs e)
{
Scheduler.NextSynchronization = "test";
}

标签应自动绑定(bind)值 test ,但不幸的是,标签仍然是空的。我究竟做错了什么?

更新

我创建了一个 Test我控制范围内的类(class):
public class Test {
private string nextSync = "N/A";

public string NextSynchronization {
get {
return nextSync;
}
set {
nextSync = value;
}
}
}

MainWindow我用这个:
DataContext = new CScheduler.Test();

似乎 Label 使用 N/A 正确初始化

最佳答案

这是正确设置 DataContext 的示例:

<Window x:Class="TestApplication.TestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

mc:Ignorable="d"
Title="TestWindow" Height="300" Width="300">
<Grid>
<TextBox Text="{Binding Text}"></TextBox>
<CheckBox IsChecked="{Binding IsChecked}"></CheckBox>
<Button Content="{Binding BtnText}"></Button>
</Grid>
public partial class MainWindow : Window
{
//MainWindow.xaml.cs
public MainWindow()
{
InitializeComponent();
//Create a new Instance of your ViewModel
MyViewModelClass viewModel = new MyViewModelClass();
//Set the DataContext (BindingContext (i.e. where to look for the Bindings) to your ViewModel
DataContext = viewModel;
}
}

定义你的 ViewModelClass:
public class MyViewModelClass: INotifyPropertyChanged
{
//Add Constructor
public MyViewModelClass()
{

}


private string _text = "sampleText shown in the TextBox";

public string Text
{
get { return _text; }
set
{
nextSync = value;
OnPropertyChanged();//PropertyName will be passed automatically
}
}

private string _isChecked = true;//CheckBox is checked by default

public string IsChecked
{
get { return _isChecked ; }
set
{
nextSync = value;
OnPropertyChanged();//PropertyName will be passed automatically
}
}

private string _btnText = "Click Me";//Text to display on the button

public string BtnText
{
get { return _btnText ; }
set
{
nextSync = value;
OnPropertyChanged();//PropertyName will be passed automatically
}
}



#region Implementation of INotifyPropertyChanged

public event PropertyChangedEventHandler PropertyChanged;

//When using the [CallerMemberName] Attribute you dont need to pass the PropertyName to the method which is pretty nice :D
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

#endregion Implementation of INotifyPropertyChanged
}

基本上是 DataContext告诉 UI 在哪里寻找 Binding。
如果未设置,则在构建时 VisualStuido 的输出窗口中会显示绑定(bind)错误。

更新:

如果使用 UserControls :

在项目中添加一个名为 UserControls 的文件夹,用于放置 xamls。
在您的窗口中为它们添加一个命名空间:
xmlns:userControls="clr-namespace:<YourApplicationName>.UserControls"

然后添加 UserControl到主窗口的网格:
<userControls:MyUserControl1></userControls:MyUserControl1>

这是重要的部分:
  • 如果您没有在 UserControl.xaml.cs 中为 UserControl 设置 DataContext
    它会自动使用父控件中的一个(在您的情况下是窗口)
  • 因此,您在窗口或用户控件中获得的所有绑定(bind)都放入了该 1 ViewModel
  • 只设置DataContext为窗口。
  • 现在应该从该 View 模型中获取所有绑定(bind)。
  • 关于c# - WPF 绑定(bind) - 标签绑定(bind)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37298996/

    25 4 0