WPF – как отслеживать изменение свойства выбранного элемента сетки данных

Я создаю приложение, в котором я следую шаблону MVVM (насколько это возможно), и я использую Prism, чтобы упростить это.

У меня есть представление, в котором пользователь может редактировать одну ячейку и в этой ячейке выбрать значение из ComboBox. Я хотел бы следить за изменением значения ComboBox выбранной строки. Например. значение изменено с "Bio" на "Pleje".

Я не знаю, как это сделать. Я знаю, что для выбранного элемента есть событие "PropertyChanged", но где я должен подписаться на него? Невозможно сделать в конструкторе, так как выбранный элемент будет нулевым.

введите здесь описание изображения

    <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>

ViewModel:

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

person Starwop    schedule 05.01.2017    source источник
comment
Пожалуйста, проверьте, выполняется ли создание экземпляров для всех объектов   -  person Vijay    schedule 05.01.2017
comment
PropertyChanged будет вызываться автоматически с помощью SetProperty(ref forældreTypeKategori, value). так вы уже подписались на это.   -  person Vijay    schedule 05.01.2017


Ответы (2)


Прежде всего, вам действительно нужно знать, когда это свойство изменилось? Большую часть времени мы просто хотим знать значение при проверке формы, и у нас есть это значение благодаря DataBinding.

Теперь давайте предположим, что вам это действительно нужно, идея состоит в том, чтобы подписаться на изменение вашей собственности. Для этого, я думаю, этот ответ поможет: should-i">MVVM в WPF - Как предупредить ViewModel об изменениях в модели... или я должен?

person Ouarzy    schedule 05.01.2017

Я знаю, что для выбранного элемента есть событие "PropertyChanged", но где я должен подписаться на него?

Когда значение выбирается в ComboBox в представлении, исходное свойство (ForældreTypeKategori), связанное с SelectedItem в ComboBox, будет установлено на выбранный элемент в ItemsSource ComboBox.

Таким образом, вы можете делать все, что хотите, в установщике этого исходного свойства:

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. Вы привязываетесь к исходным свойствам, которые устанавливает представление.

Кстати, считается плохой практикой не использовать английские имена членов вашего класса, таких как свойства и методы, независимо от того, какой у вас родной язык.

person mm8    schedule 05.01.2017