我正在创建一个我遵循MVVM模式的应用程序(尽我所能),而我正在使用Prism来使这更容易。
我有一个视图,用户可以在其中编辑一个单元格,在此单元格中,从ComboBox中选择一个值。我想监视所选行的ComboBox值何时发生变化。例如。价值从" Bio"到" Pleje"。
我不知道该怎么做。我知道" PropertyChanged"所选项目上的事件,但我应该在哪里订阅它?无法在构造函数中完成,因为所选项目将为null。
<DataGrid Grid.Column="0" Grid.Row="2" AlternationCount="2" AlternatingRowBackground="#cee8ff" CanUserAddRows="False" AutoGenerateColumns="False" ItemsSource="{Binding Path=Familier}" SelectedItem="{Binding ValgtFamilie, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<DataGrid.Columns>
<DataGridTextColumn Header="Cpr" Binding="{Binding Path=CPR}" IsReadOnly="True"/>
<DataGridTextColumn Header="Fornavn" Width="*" Binding="{Binding Path=Fornavn}" IsReadOnly="True"/>
<DataGridTextColumn Header="Efternavn" Width="*" Binding="{Binding Path=Efternavn}" IsReadOnly="True"/>
<DataGridTemplateColumn Header="Forældre Type">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=ForældreTypeKategori}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Path=DataContext.ForældreTypeKategorier, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" SelectedItem="{Binding Path=ForældreTypeKategori, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" IsSynchronizedWithCurrentItem="True"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
视图模型:
private Familie valgtFamilie;
public Familie ValgtFamilie
{
get { return valgtFamilie; }
set { valgtFamilie = value; SetProperty(ref valgtFamilie, value); }
}
型号:
internal class Familie : BindableBase
{
private string cpr;
public string CPR
{
get { return cpr; }
set { cpr = value; SetProperty(ref cpr, value); }
}
private string fornavn;
public string Fornavn
{
get { return fornavn; }
set { fornavn = value; SetProperty(ref fornavn, value); }
}
private string efternavn;
public string Efternavn
{
get { return efternavn; }
set { efternavn = value; SetProperty(ref efternavn, value); }
}
private ForældreTypeKategori forældreTypeKategori;
public ForældreTypeKategori ForældreTypeKategori
{
get { return forældreTypeKategori; }
set { forældreTypeKategori = value; SetProperty(ref forældreTypeKategori, value); }
}
}
答案 0 :(得分:0)
首先,你真的需要知道这个属性何时改变了吗?大多数情况下,我们只是想在验证表单时知道值,并且由于DataBinding,我们有这个值。
现在让我们假设你真的需要它,我们的想法是订阅你的财产的变化。为此,我认为这个答案会有所帮助:MVVM in WPF - How to alert ViewModel of changes in Model... or should I?
答案 1 :(得分:0)
我知道所选项目上有“PropertyChanged”事件,但我应该在哪里订阅它?
当在视图中的ComboBox中选择一个值时,绑定到SelectedItem和ComboBox的源属性(ForældreTypeKategori)将被设置为选中的ComboBox的ItemsSource中的项目。
所以你可以在这个源属性的setter中做任何你想做的事情:
private ForældreTypeKategori forældreTypeKategori;
public ForældreTypeKategori ForældreTypeKategori
{
get { return forældreTypeKategori; }
set
{
forældreTypeKategori = value;
SetProperty(ref forældreTypeKategori, value);
//handle the change here...
}
}
这就是MVVM的工作原理。您绑定到视图设置的源属性。
顺便说一下,不管你的母语是什么,不使用你的班级成员的英文名称(例如属性和方法)被认为是一种不好的做法。