Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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/6/EmptyTag/129.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# 对低级对象更改的DependencyProperty/InotifyProperty_C#_.net_Wpf_User Interface_Mvvm - Fatal编程技术网

C# 对低级对象更改的DependencyProperty/InotifyProperty

C# 对低级对象更改的DependencyProperty/InotifyProperty,c#,.net,wpf,user-interface,mvvm,C#,.net,Wpf,User Interface,Mvvm,我有一些相当低级的类,它们在我正在开发的WPF应用程序中使用。例如,一个表示将在ScrollViewer中显示为列表并使用DataTemplate显示的对象。绑定对于UI中使用的几个属性非常有用,我使用这个对象纯粹是因为它可以方便地传递到UI。问题是UI没有收到数据更改的通知,因为它没有实现INotifyPropertyChanged或DependencyProperty 提到的类是一个库的一部分,可以完全独立于UI使用,所以我担心它会被特定于UI的东西弄得乱七八糟(特别是对于INPC,对于这样

我有一些相当低级的类,它们在我正在开发的WPF应用程序中使用。例如,一个表示将在ScrollViewer中显示为列表并使用DataTemplate显示的对象。绑定对于UI中使用的几个属性非常有用,我使用这个对象纯粹是因为它可以方便地传递到UI。问题是UI没有收到数据更改的通知,因为它没有实现INotifyPropertyChanged或DependencyProperty

提到的类是一个库的一部分,可以完全独立于UI使用,所以我担心它会被特定于UI的东西弄得乱七八糟(特别是对于INPC,对于这样一个小东西来说,这是一个疯狂的代码量)


在这种情况下通常要做的是,用UI cruft将低级类弄乱,或者创建一个用于UI的包装器类。或者还有其他选择吗?

为了实现良好的分离,我将创建一个类来包装库类。包装器将实现INotifyPropertyChanged接口,并公开在更新时触发PropertyChanged事件的公共属性。包装器将从包装的类中获取并设置实际值

public class Internal
{
    public int MyProperty { get; set; }
}

public class WrapperForInternal : INotifyPropertyChanged
{
    public event PropertyChanged(object sender, PropertyChangedEventArgs e);

    private Internal _i;
    public WrapperForInternal(Internal i)
    {
        _i = i;
    }

    public int MyProperty
    {
        get { return _i.MyProperty; }
        set
        {
            _i.MyProperty = value;
            RaisePropertyChanged("MyProperty");
        }
    }

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

或者,您可以从内部类派生并添加触发事件的接口和额外属性。但我自己更喜欢完全分离。

就个人而言,我可能会编写一个包装器,尽管我不知道这是否是最好的选择。问题的一部分是,由于在一些较低代码中运行工作线程,底层类中的值可能会更改。。。因此,我猜PropertyChanged事件在这种情况下不会被触发?在这种情况下,我建议您将内部属性MyProperty设置为虚拟,然后继承一个实现INotifyPropertyChanged的类。还重写MyProperty,以便在更新时触发更改事件。