Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/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
在代码中更改的WPF数据绑定对象未反映在UI中_Wpf_Data Binding - Fatal编程技术网

在代码中更改的WPF数据绑定对象未反映在UI中

在代码中更改的WPF数据绑定对象未反映在UI中,wpf,data-binding,Wpf,Data Binding,这里是WPF-MVVM初学者。 我的问题:在WPF-MVVM UI中,我正在编辑一个实体。更改某些属性时,需要自动更新其他属性。这些都是在实体类、集合方法中完成的,但没有反映在我的视图中 更多详情: 1) 我将模型(一个带有属性的简单类)放在一个单独的程序集中(与WPF无关,因为它是通用业务模型)。请注意,“SomeOption”设置为false时,需要自动更改其他一些选项。 例如: 2) WPF UI有一个实现INotifyPropertyChanged的基本ViewModel。当前编辑的记录

这里是WPF-MVVM初学者。 我的问题:在WPF-MVVM UI中,我正在编辑一个实体。更改某些属性时,需要自动更新其他属性。这些都是在实体类、集合方法中完成的,但没有反映在我的视图中

更多详情: 1) 我将模型(一个带有属性的简单类)放在一个单独的程序集中(与WPF无关,因为它是通用业务模型)。请注意,“SomeOption”设置为false时,需要自动更改其他一些选项。 例如:

2) WPF UI有一个实现INotifyPropertyChanged的基本ViewModel。当前编辑的记录(员工)是ViewModel的公共属性:

public Employee SelectedEmployee

{
    get { return _selectedEmployee; }
    set
    {

        if (_selectedEmployee != value)
        {
            _selectedEmployee = value;

            OnPropertyChanged(nameof(SelectedEmployee));

        }
    }
}
3) 当取消选中绑定到“SomeOption”的复选框时,实体代码中更改的其他属性不会反映在视图中,并保留在用户编辑的屏幕上


请让我知道我错过了什么。谢谢

您应该在模型中实现
INotifyPropertyChanged
,以更新UI中的实体。例如:

public class Employee : BaseEntity, INotifyPropertyChanged
{
    private string employeeNumber;
    public string EmployeeNumber { 
      get{return employeeNumber};
       set
          { 
             employeeNumber=value;
             OnPropertyChanged("EmployeeNumber");
          } 

    //...Other properties...
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChangedEvent(string propertyName)
    {
       var handler = PropertyChanged;
       if (handler != null)
          handler(this, new PropertyChangedEventArgs(propertyName));
    }           
}

Employee
需要像viewmodel一样实现
INotifyPropertyChanged
,并在更改自己的属性时启动
PropertyChanged
(您正在调用的
OtherOption
OtherProperty
,等等)


当视图模型选择不同的
员工
时,您现在得到的将更新UI,但是对该
员工
的后续更改不会发送任何通知

我对这个项目的计划是让模型完全独立,接口不可知,假设它可能有一个WPF UI,但也可能有一个Web接口。在这种情况下,我该怎么做?@KeithJones我发现WPF的学习曲线有点痛苦(文档的质量当然没有帮助),但在花了几年时间之后,我害怕再次被局限于WinForms。WPF功能非常强大。@EdPlunkett,谢谢。你能给出一个数字,说明你需要多少个月才能变得更有效率?我已经做了一个多月了,仍然觉得我几乎什么都做不了。作为一名开发人员,我有很多年的经验,所以这有点令人震惊,因为无论我以前学到什么,它总是更快。的确,我正在为一个大项目奠定基础,所以我不想只是让它工作,我正试图用一个好的结构(因此是MVVM,并试图尽可能的干净和“纯粹”)@KeithJones我想我花了大约一年的时间与XAML合作才开始真正“得到它”,但这被一年中的就业差距打断了,我认为我不想再当程序员了。早些时候,我参加了一个PluralSight视频课程,这给了我很大的帮助。与winforms相比,仅仅通过反复学习winforms要困难得多,因为概念是如此的不同。这对我来说是个问题,因为我更喜欢在实践中学习。@KeithJones是的,Ed Plunkett是对的!在stackoverflow和WPF MSDN论坛上,我通过Pluralsight和Practice学习了WPF和Prism以及许多愚蠢的问题。不要害羞地问问题,永远不要放弃。我们是来帮助你的!:)与另一个答案的回答相同:我对这个项目的计划是让模型完全独立,并且接口不可知,假设它可能得到一个WPF UI,但也可能有一个Web接口。在这种情况下我该怎么做?@KeithJones对,是的。没有一个真正干净的选择。人们通常会围绕模型类编写一个包装器VM,它只围绕普通模型属性包装通知的访问器属性。在我们的代码库中,我们有几十个这样的类。我希望有更好的办法。
public class Employee : BaseEntity, INotifyPropertyChanged
{
    private string employeeNumber;
    public string EmployeeNumber { 
      get{return employeeNumber};
       set
          { 
             employeeNumber=value;
             OnPropertyChanged("EmployeeNumber");
          } 

    //...Other properties...
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChangedEvent(string propertyName)
    {
       var handler = PropertyChanged;
       if (handler != null)
          handler(this, new PropertyChangedEventArgs(propertyName));
    }           
}