Имея две коллекции в 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,