C# 如何在WPF中正确绑定模型?
我有一个名为ViewModel的类,它实现了INotifyPropertyChanged接口。在我的XAML中,我有3个文本框,它们的绑定属性与我的ViewModel属性相匹配: 测试排序 测试完成 测试维护 我的代码中有一个PropertyChanged事件处理程序。我有一个上下文“MyContext”附加到XAML窗口。我不确定为什么在更改TestsOrdered和TestsCompleted值时UI不更新。我希望UI在我从文本框中签出时更新,但直到我从TestsMaining文本框中签出时才更新。我的设计中的缺陷在哪里C# 如何在WPF中正确绑定模型?,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我有一个名为ViewModel的类,它实现了INotifyPropertyChanged接口。在我的XAML中,我有3个文本框,它们的绑定属性与我的ViewModel属性相匹配: 测试排序 测试完成 测试维护 我的代码中有一个PropertyChanged事件处理程序。我有一个上下文“MyContext”附加到XAML窗口。我不确定为什么在更改TestsOrdered和TestsCompleted值时UI不更新。我希望UI在我从文本框中签出时更新,但直到我从TestsMaining文本框中签出时
public partial class MainWindow : Window
{
public ViewModel vm;
public MainWindow()
{
InitializeComponent();
vm = new ViewModel();
//ct = new CompletionTime();
//ct.TestsOrdered = 8000;
vm.Name = "John Doe";
vm.TestsCompleted = 0;
vm.TestsOrdered = 0;
vm.TestsRemaining = 0;
this.MyContext.DataContext = vm;
}
private void btnName_Click(object sender, RoutedEventArgs e)
{
vm.Name = "Joe";
}
}
public class ViewModel : INotifyPropertyChanged
{
private string name;
private int mTestsOrdered;
private int mTestsRemaining;
private int mTestsCompleted;
public string Name
{
get { name; }
set
{
if (name != value)
{
name = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Name"));
}
}
}
}
public int TestsOrdered
{
get { return mTestsOrdered; }
set
{
if (mTestsOrdered != value)
{
mTestsOrdered = value;
PropertyChanged(this, new PropertyChangedEventArgs("TestsOrdered"));
}
}
}
public int TestsCompleted
{
get { return mTestsCompleted; }
set
{
if (mTestsCompleted != value)
{
mTestsCompleted = value;
PropertyChanged(this, new PropertyChangedEventArgs("TestsCompleted"));
}
}
}
public int TestsRemaining
{
get { return TestsOrdered - TestsCompleted; }
set
{
if (mTestsRemaining != value)
{
mTestsRemaining = value;
PropertyChanged(this, new PropertyChangedEventArgs("TestsRemaining"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
MyContext是保存ViewModel对象的DataContext
XAML:
您的绑定和属性编写正确。但是,问题在于将viewmodel实例分配到
窗口中。您需要在属性DataContext
上设置viewmodel的实例,绑定才能工作。像这样:
public MainWindow()
{
InitializeComponent();
vm = new ViewModel();
//ct = new CompletionTime();
//ct.TestsOrdered = 8000;
vm.Name = "John Doe";
vm.TestsCompleted = 0;
vm.TestsOrdered = 0;
vm.TestsRemaining = 0;
//this.MyContext.DataContext = vm;
this.DataContext = vm; // <-- Like so
}
public主窗口()
{
初始化组件();
vm=新的ViewModel();
//ct=新的完成时间();
//ct.TestsOrdered=8000;
vm.Name=“John Doe”;
vm.TestsCompleted=0;
vm.TestsOrdered=0;
vm.TestsRemaining=0;
//this.MyContext.DataContext=vm;
this.DataContext=vm;//您能提供一个代码示例,说明您在xaml中绑定属性的时间吗?还有,什么是MyContext
?您好,Nautilus。我添加了一些xaml。我的印象是,我在xaml中分配了绑定路径,WPF在幕后处理其余的内容。我缺少什么?您是对的,但您没有将视图模型实例放在窗口实例的错误属性上。绑定
类使用窗口
属性:数据上下文
作为绑定到的默认对象。可以说绑定的完整路径是.DataContext.
。解决方法是将视图模型实例设置在正确的属性上tyDataContext
。我会给你写一个答案。你好,很好。我像你提到的那样对它进行了更改。奇怪的是,直到我从最后一个文本框中取出tab,它仍然无法计算/绑定。我仍然缺少一些东西。好吧。我知道是怎么回事了。我希望模型中的所有属性都会更新。我想我应该有一个le将EventArgs的name属性设置为null。好的,绑定现在已连接到该属性。新问题是它的更新方式。更改绑定以包括以下内容:UpdateSourceTrigger=PropertyChanged
。textbox的默认值为LostFocus
。EventArgs中的空属性名称将触发所有bin的更新从技术上讲,将上下文设置为另一个元素是完全有效的,只要他在所述元素上使用x:Name=“MyContext”
,从上面的XAML代码不能确定他是否这样做了,因为它只显示了整个XAML代码的一个片段
public MainWindow()
{
InitializeComponent();
vm = new ViewModel();
//ct = new CompletionTime();
//ct.TestsOrdered = 8000;
vm.Name = "John Doe";
vm.TestsCompleted = 0;
vm.TestsOrdered = 0;
vm.TestsRemaining = 0;
//this.MyContext.DataContext = vm;
this.DataContext = vm; // <-- Like so
}