繁体   English   中英

项目模板内的用户控件的WPF更改通知不起作用

[英]WPF change notification of user control inside item template not working

我试图将ObservableCollection<FilterControlViewmodel>中的每个视图模型作为DataContextItemsControl的用户控件FilterControl

绑定本身可以正常工作。 FilterControlViewmodel.FilterName正确显示了"InitialFilterName" ,但是该属性的任何更新都不会通知UI。

另外,向ObservableCollection<FilterControlViewmodel>添加元素也可以找到并添加其他用户控件。 但是同样, FilterControlViewmodel内部的值不会更新到UI。

任何有关缺少通知的提示都将不胜感激。 谢谢。

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

您应删除以下标记,因为它会创建FilterControlViewmodel另一个实例:

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

然后, FilterControl将从ItemsControl的当前项目( FilterControlViewmodel )继承其DataContext ,而无需显式设置DataContext属性:

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

暂无
暂无

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

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