繁体   English   中英

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

[英]WPF - How to monitor datagrid selecteditem property change

我正在创建一个应用程序,我正在遵循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); }
    }
}

首先,你真的需要知道这个属性何时改变了吗? 大多数情况下,我们只想在验证表单时知道值,并且由于DataBinding,我们有这个值。

现在让我们假设你真的需要它,我们的想法是订阅你的财产的变化。 为此,我认为这个答案会有所帮助: WPF中的MVVM - 如何提醒ViewModel模型中的变化......还是应该?

我知道所选项目上有“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的工作原理。 您绑定到视图设置的源属性。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM