没有INotifyPropertyChanged的基类上的PropertyChanged

时间:2018-10-02 12:55:45

标签: c# inheritance prism observablecollection inotifypropertychanged

简单的问题,但在解决方案中苦苦挣扎...

我有一个基础课。在此基类中无法实现INotifyPropertyChanged。

我正在使用MVVM(棱镜),并且我的VM包含一个ObservableCollection。 这个ObservableCollection是Datagrid的itemsSource。

问题是:当我更改Datagrid中的单元格时,如何通知我的VM(以及哪个属性)已更改?

谢谢!

编辑:添加了代码

基类:

public class BaseClass
{
   public string Name { get; set; }
}

VM属性:

private ObservableCollection<BaseClass> mycollection

public ObservableCollection<BaseClass> MyCollection
{
   get
   {
      return mycollection
   }
   set
   {
      SetProperty(ref mycollection, value);
   }
}

XAML:

<DataGrid          
   AutoGenerateColumns="False"
   CanUserAddRows="False"
   GridLinesVisibility="None"
   ItemsSource="{Binding MyCollection, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"                      
   SelectionMode="Single">
   <DataGrid.Columns>
      <DataGridTemplateColumn Width="*" Header="Value">
         <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
               <TextBox Text="{Binding Value,  Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
            </DataTemplate>
         </DataGridTemplateColumn.CellTemplate>
      </DataGridTemplateColumn>  
   </DataGrid.Columns>                  
</DataGrid>

2 个答案:

答案 0 :(得分:0)

创建一个“外观”,例如创建一个具有相同属性但也继承自INPC的模型。当立面上的“名称”属性更改时,请将值设置为“基类”对象,然后调用INPC。

public class BaseClass { public string Name { get; set; } }

public class FacadeBaseClasse : INotifyPropertyChanged //Facade that implements INPC interface
{
    private readonly BaseClass baseC;
    public string Name
    {
        get => baseC.Name;
        set 
        {
            baseC.Name = value;
            OnPropertyChange();
        }
}

答案 1 :(得分:0)

假设<TextBox Text="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />是一个错字,而您的意思是Binding Name,然后在上面我的评论中进行扩展:

如果您要通知数据网格(即单元格的文本框)对集合中某项的Name所做的更改,则必须实施{{ 1}}(除非您对整个集合进行更改,而您的用户不希望这样做,因为它至少会重置滚动)。

如果您希望在用户通过单击项目的单元格并键入内容来更改项目的INotifyPropertyChanged时通知应用程序的其余部分,则您完全可以自由选择消息传递机制。当然,最好使用{p>这样的选项来修改Name

  • BaseClass.Name(也可以由服务使用,它不仅限于ui)
  • 经典的.net事件,例如INotifyPropertyChanged NameChanged`
  • event Action<object,NameChangedEventArgs,例如IEventAggregator

如果您绝对不能修改_eventAggregator.GetEvent<NameChangedEvent>().Publish( new NameChangedEventArgs( this, newName, oldName ) ),则可以创建一个观察者,该观察者围坐在身边并定期检查他知道的所有项目,并将其当前名称与最近的已知状态进行比较,然后执行上述操作之一它检测到变化。不过,这并不是最有效的解决方案,因为您必须注册所有项目并取消注册它们或使用弱引用(这会增加额外的开销)。