Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WPF中正确绑定模型?_C#_Wpf_Xaml_Mvvm - Fatal编程技术网

C# 如何在WPF中正确绑定模型?

C# 如何在WPF中正确绑定模型?,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我有一个名为ViewModel的类,它实现了INotifyPropertyChanged接口。在我的XAML中,我有3个文本框,它们的绑定属性与我的ViewModel属性相匹配: 测试排序 测试完成 测试维护 我的代码中有一个PropertyChanged事件处理程序。我有一个上下文“MyContext”附加到XAML窗口。我不确定为什么在更改TestsOrdered和TestsCompleted值时UI不更新。我希望UI在我从文本框中签出时更新,但直到我从TestsMaining文本框中签出时

我有一个名为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.
。解决方法是将视图模型实例设置在正确的属性上ty
DataContext
。我会给你写一个答案。你好,很好。我像你提到的那样对它进行了更改。奇怪的是,直到我从最后一个文本框中取出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
}