Уведомление об изменении WPF пользовательского элемента управления внутри шаблона элемента не работает - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь связать каждую модель представления в ObservableCollection<FilterControlViewmodel> как DataContext с пользовательским элементом управления FilterControl в ItemsControl.

Сама привязка работает нормально."InitialFilterName" отображается правильно из FilterControlViewmodel.FilterName, но о любых обновлениях свойства пользовательский интерфейс не уведомляется.

Также добавление элементов в ObservableCollection<FilterControlViewmodel> работает с поиском и добавлением дополнительных пользовательских элементов управления.Но опять же значения внутри FilterControlViewmodel не обновляются до пользовательского интерфейса.

Любой намек на то, где уведомление отсутствует, приветствуется.Спасибо.

MainWindow.xaml

<Window.DataContext>
   <local:MainWindowViewmodel/>
</Window.DataContext>

<Grid>
   <ItemsControl ItemsSource="{Binding FilterViewmodel.FilterControls}">
      <ItemsControl.ItemTemplate>
          <DataTemplate>
             <filter:FilterControl DataContext="{Binding}"></filter:FilterControl>
          </DataTemplate>
       </ItemsControl.ItemTemplate>
  </ItemsControl>
</Grid>

FilterControl.xaml

<UserControl.DataContext>
   <local:FilterControlViewmodel/>
</UserControl.DataContext>

<Grid>
   <Label Grid.Column="0" Grid.Row="0" Content="{Binding FilterName}"></Label>
   <ComboBox Grid.Column="0" Grid.Row="1" ItemsSource="{Binding FilterValues}" SelectedItem="{Binding FilterValueSelected}"></ComboBox>
   <Button Grid.Column="1" Grid.Row="1" Content="X" Command="{Binding ResetFilterCommand}"></Button>
</Grid>

MainWindowViewmodel.cs

public class MainWindowViewmodel : INotifyPropertyChanged
{
   public FilterViewmodel FilterViewmodel
        {
            get => _filterViewmodel;
            set
            {
                if (Equals(value, _filterViewmodel)) return;
                _filterViewmodel = value;
                OnPropertyChanged();
            }
        }

FilterViewmodel.cs

public class FilterViewmodel : INotifyPropertyChanged
{
  public ObservableCollection<FilterControlViewmodel> FilterControls
        {
            get => return _filterControls;
            set
            {
                if (Equals(value, _filterControls)) return;
                _filterControls = value;
                OnPropertyChanged();
            }
        }

FilterControlViewmodel.cs

public class FilterControlViewmodel : INotifyPropertyChanged
{
   private string _filterName = "InitialFilterName";
   public string FilterName
   {
      get => _filterName;
      set
      {
         if (value == _filterName) return;
         _filterName = value;
         OnPropertyChanged();
      }
   }

1 Ответ

1 голос
/ 13 мая 2019

Вы должны удалить следующую разметку, поскольку она создает другой экземпляр FilterControlViewmodel:

<UserControl.DataContext>
   <local:FilterControlViewmodel/>
</UserControl.DataContext>

FilterControl будет наследовать DataContext от текущего элемента (FilterControlViewmodel) в ItemsControl без необходимости явно устанавливать свойство DataContext:

<ItemsControl ItemsSource="{Binding FilterViewmodel.FilterControls}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <filter:FilterControl/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...