WPF - 如何监视datagrid selecteditem属性更改

时间:2017-01-05 10:17:37

标签: c# wpf mvvm prism propertychanged

我正在创建一个我遵循MVVM模式的应用程序(尽我所能),而我正在使用Prism来使这更容易。

我有一个视图,用户可以在其中编辑一个单元格,在此单元格中,从ComboBox中选择一个值。我想监视所选行的ComboBox值何时发生变化。例如。价值从" Bio"到" Pleje"。

我不知道该怎么做。我知道" PropertyChanged"所选项目上的事件,但我应该在哪里订阅它?无法在构造函数中完成,因为所选项目将为null。

enter image description here

    <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); }
    }
}

2 个答案:

答案 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的工作原理。您绑定到视图设置的源属性。

顺便说一下,不管你的母语是什么,不使用你的班级成员的英文名称(例如属性和方法)被认为是一种不好的做法。