简单的问题,但在解决方案中苦苦挣扎...
我有一个基础课。在此基类中无法实现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>
答案 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)INotifyPropertyChanged
NameChanged` event Action<object,NameChangedEventArgs
,例如IEventAggregator
如果您绝对不能修改_eventAggregator.GetEvent<NameChangedEvent>().Publish( new NameChangedEventArgs( this, newName, oldName ) )
,则可以创建一个观察者,该观察者围坐在身边并定期检查他知道的所有项目,并将其当前名称与最近的已知状态进行比较,然后执行上述操作之一它检测到变化。不过,这并不是最有效的解决方案,因为您必须注册所有项目并取消注册它们或使用弱引用(这会增加额外的开销)。