Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.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_Data Binding - Fatal编程技术网

C# WPF数据绑定到外部数据模型

C# WPF数据绑定到外部数据模型,c#,wpf,data-binding,C#,Wpf,Data Binding,我最近开始使用WPF开发一个应用程序,但我真的无法集中精力解决以下问题: 我有一个应用程序的域模型,它是简单的POCO对象,序列化到硬盘或从硬盘序列化。然后我有了WPF应用程序,我想将它绑定到模型的各个部分。我需要能够通知UI对基础模型的更改(例如,实现INotifyPropertyChanged),但我希望这样做不会与我的模型相互影响(阅读时不会修改模型的当前实现)。除了修改模型,我如何实现更改通知? 我想这样做的原因是我在多个项目之间共享模型,只有一个是WPF,我不想向模型中添加不必要的代码

我最近开始使用WPF开发一个应用程序,但我真的无法集中精力解决以下问题:

我有一个应用程序的域模型,它是简单的POCO对象,序列化到硬盘或从硬盘序列化。然后我有了WPF应用程序,我想将它绑定到模型的各个部分。我需要能够通知UI对基础模型的更改(例如,实现INotifyPropertyChanged),但我希望这样做不会与我的模型相互影响(阅读时不会修改模型的当前实现)。除了修改模型,我如何实现更改通知? 我想这样做的原因是我在多个项目之间共享模型,只有一个是WPF,我不想向模型中添加不必要的代码。 我想到的一件事是创建模型的“副本”(使用INotifyPropertyChanges和BindingList等),但这似乎很难维护。。。 提前谢谢


Ondrej

我在这里看到两种可能的解决方案:

  • 仅对WPF屏幕使用单独的型号()。这将需要维护两个不同的模型,还需要准备大量映射代码
  • 使用PostSharp使用所有必要的样板代码“增强”您的模型。您可以找到自动INotifyPropertyChanged实现的示例。请记住,将PostSharp引入项目是一个重要的决定,因此我建议先熟悉它
  • 看看这个

    下载其源代码,请参见层次结构

    基本上,您仍然保留简单的POCO对象作为模型。然后围绕模型创建ViewModel,如下所示:

    public class CustomerViewModel : INotifyPropertyChanged
    {
            readonly Customer _customer;
            public CustomerViewModel(Customer customer)
            {
                _customer = customer;
            }
    
            public string FirstName
            {
                get { return _customer.FirstName; }
                set
                {
                    if (value == _customer.FirstName)
                        return;
    
                    _customer.FirstName = value;
    
                    OnPropertyChanged("FirstName");
                }
            }
            ...
    }
    

    我有一个完美的解决方案,它包括使用反射创建一个更改缓存,并使用TypeDescriptor使适配器看起来像原始的数据绑定对象。。。除了原作者网站崩溃,他还没有把那篇文章放回去:(。我在试着看能不能让他放上去,否则我可能不得不写一篇类似的文章…我很想看看那段代码。你让他把那篇文章放回去了吗?谢谢