Свойство TriggerChanged определенного элемента в коллекции

Имея две коллекции в ViewModelодном, один работает как источник строк для DataGrid(в этом случае имеют только ObservableObjects 1,2,3, ..) и другого объекта, который представляет FullyObservableCollection для одного столбца в DataGrDataGridComboBoxColumn (на основе идентификатора expose некоторое значение в собственности).

В приведенном ниже примере я использовал дефолт DataGridTemplateColumnи ComboBoxповедение, но он также был опробован с другими типами коллекций без успеха. Поведение WPF было протестировано на обоих и с .public class ViewModel : ObservableObject { private FullyObservableCollection<Seq> mSequencer; public FullyObservableCollection<Seq> Sequencer { get { return mSequencer; } set { SetProperty(ref mSequencer, value); } } private FullyObservableCollection<RowSrc> mRowSource; public FullyObservableCollection<RowSrc> RowSource { get { return mRowSource; } set { SetProperty(ref mRowSource, value); } } }public class Seq : ObservableObject { private int mId; public int Id { get { return mId; } set { SetProperty(ref mId, value); } } private string mName; public string Name { get { return mName; } set { SetProperty(ref mName, value); } } } public class RowSrc : ObservableObject { private int mValue; public int Value { get { return this.mValue; } set { SetProperty(ref mValue, value); } } }<CollectionViewSource x:Key="Proxy" Source="{Binding Sequencer}"/> <DataGrid ItemsSource="{Binding RowSource}"> <DataGrid.Columns> <DataGridComboBoxColumn ItemsSource="{Binding Source={StaticResource Proxy}" SelectedValueBinding="{Binding Value}" SelectedValuePath="Id" DisplayMemberPath="Name"/> </DataGridComboBoxColumn> </DataGrid.Columns> </DataGrid>


ViewModel:

RowSource

Определения классов:

Proxy

Просмотр - XAML:

Sequencer

Из вышесказанного, datagrid инициализируется значениями Value, которые будут проходить через туннель с привязкой к тому Id, что приведет к Sequencer. На основе Valueкаждой строки объект с таким же Idбудет возвращен из коллекции.Sequencer.Clear(); Sequencer.AddRange(...);

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

Sequencer

Теперь элементы в Sequencerобновлении, однако привязка между ними Row[n].Comboboxи элементами в Sequencer НЕ РЕФРЕСС . Причина этого в том, что сами свойства не изменились, а только элементы в коллекции.


Обходное решение - взломать:

public class RowSrc
{
    ...

    public void InvokeChange()
    {
        OnPropertyChanged(nameof(Value));
    }
}

public class ViewModel
{
    Sequencer.Clear();
    Sequencer = GenerateNewCollection();

    //after update of Sequencer
    foreach (var nRowSrc in RowSrc) nRowSrc.InvokeChange();
}

Однако это означает, что нам потребуется ObsevrableCollection этот конкретный метод для каждого из наших классов Model, а затем не забудьте вызвать их при каждом изменении Sequencer.

В: Как вызвать изменение свойств автоматически, когда коллекция изменилась ИЛИ как правильно обработать это привязку?

c#,wpf,combobox,binding,inotifypropertychanged,

1

Ответов: 2


ViewModel:

RowSource

Определения классов:

Proxy

Просмотр - XAML:

Sequencer

Из вышесказанного, datagrid инициализируется значениями Value, которые будут проходить через туннель с привязкой к тому Id, что приведет к Sequencer. На основе Valueкаждой строки объект с таким же Idбудет возвращен из коллекции.Sequencer.Clear(); Sequencer.AddRange(...);

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

Sequencer

Теперь элементы в Sequencerобновлении, однако привязка между ними Row[n].Comboboxи элементами в Sequencer НЕ РЕФРЕСС . Причина этого в том, что сами свойства не изменились, а только элементы в коллекции.


Обходное решение - взломать:

public class RowSrc
{
    ...

    public void InvokeChange()
    {
        OnPropertyChanged(nameof(Value));
    }
}

public class ViewModel
{
    Sequencer.Clear();
    Sequencer = GenerateNewCollection();

    //after update of Sequencer
    foreach (var nRowSrc in RowSrc) nRowSrc.InvokeChange();
}

Однако это означает, что нам потребуется ObsevrableCollection этот конкретный метод для каждого из наших классов Model, а затем не забудьте вызвать их при каждом изменении Sequencer.

В: Как вызвать изменение свойств автоматически, когда коллекция изменилась ИЛИ как правильно обработать это привязку?

21
0

Для проблемы, которую вы опубликовали, очень просто, просто используйте Listвместо a ObsevrableCollection. В самом деле, Addдозы не только сообщать Addи Removeэто сообщить все виды движения , которые поддерживают с помощью INotifyCollectionChanged.CollectionChangedсобытия. Поэтому, если вы используете indexer ObsevrableCollectionдля установки элемента, CollectionChangedтип типа NotifyCollectionChangedAction.Replaceбудет поднят, и механизм привязки обработает его в порядке. Но я немного смущен после того, как прочитал ваш комментарий, и не могу быть уверен, действительно ли это то, что вы хотите.


0

Вы можете поднять событие PropertyChanged для своего свойства Prop1через вызов MyList[0].OnPropertyChanged(nameof(Foo.Prop1));.

Нет необходимости создавать TriggerPropertyChangedметод.

Это работает, потому что в вашем примере OnPropertyChangedявляется общедоступным и необязательно принимает строку, которая описывает имя свойства.

C #, WPF, выпадающий, связывание, INotifyPropertyChanged,
Похожие вопросы