【问题标题】:How to Update bindings when when an object with no INotifyPropertyChanged implemented. WPF实现没有 INotifyPropertyChanged 的​​对象时如何更新绑定。 WPF
【发布时间】:2017-03-13 09:22:26
【问题描述】:

我有一个ViewModel,它继承自BindableBase 类,它是Prism 的一个实现INotifyPropertyChanged 的类。

 public class MyViewModel : BindableBase { }

我有一个使用 SetProperty 方法的属性来通知 UI 任何更改。

private ClassA _sourceA;
public ClassA  SourceA {
    get { return _sourceA; }
    set { SetProperty(ref _sourceA, value); }
}

该属性是来自后面代码中另一个 source 对象的引用。

private void UpdateView(ClassA source) {
    SourceA = source;// the source object does not implement INotifyPropertyChanged
}

当用户更改UI XAML 中的一个值时,后面代码中source 对象中的其他一些值将相应更改。

source(来自 UpdateView 方法) 对象更新时如何更新 UI?

【问题讨论】:

    标签: c# wpf xaml prism inotifypropertychanged


    【解决方案1】:

    您可以使用 DependencyProperty 代替 INotifyPropertyChanged。

    DependencyProperty.Register("SourceA", typeof(ClassA), typeof(MainWindow));
    

    Interwebz 的一些例子

    【讨论】:

    • 好的,我从来没有使用过DependencyProperty,看起来很简单,但我无法让它工作。我想我在这里遗漏了一些东西。如何在 ViewModel 中设置新的 DP,然后将更改应用到 UI?如何将新值绑定到组合框
    • @IBRA 有很多关于这个stackoverflow.com/questions/15132538/…的示例
    【解决方案2】:

    当源(来自 UpdateView 方法)对象更新时如何更新 UI?

    您需要为绑定到视图中目标属性的每个源属性引发视图模型的PropertyChanged 事件,即,对于要在视图中更新的源对象的每个属性,您应该调用BindableBase 类的OnPropertyChanged 方法:

    OnPropertyChanged("Property1");
    OnPropertyChanged("Property2");
    

    ...

    每当源对象的属性发生更改时,您都需要执行此操作。这意味着源对象必须引发一个事件或某事来通知任何其他类。

    【讨论】:

    • 上面代码中的UpdateView方法里面,该方法从不同的项目中获取source参数,为不同的平台,WPF,web等提供相同的对象...我想知道有没有是在源对象发生更改时通知 UI 或 SourceA 属性的任何方式。
    • 不,您必须引发 PropertyChanged 事件以在源对象发生更改时通知视图,这要求您能够确定源对象何时更改,正如我在答案中提到的那样。通知 UI 的方式为所有数据绑定源属性引发 PropertyChanged 事件。
    • 这能回答你的问题吗?
    【解决方案3】:

    如果该模型在其他地方并且您无法更改它(无法实现 INPC),也许您应该制作一些模仿该模型的包装器模型,并在该包装器模型上实现 INPC。这样你的用户界面就会更新。 也许这个链接会有所帮助-What is a wrapper class?

    【讨论】:

      猜你喜欢
      • 2021-10-02
      • 2021-02-11
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 2013-07-31
      相关资源
      最近更新 更多