StackPanel(在ItemsControl内)的可见性可以由按钮控制吗?

问题描述 投票:0回答:2

我有一个属性 List<Filter> Filters 也就是 ItemSourceItemsControl. 我想达到的目的是在开始时只显示具有以下属性的过滤器 IsShown = true. 然后,当我按下按钮时,显示其余的过滤器。是否可以用XAML来完成?如果不可以,我应该使用哪种方法?

内容是 Filter class 是。

        public List<string> Options { get; set; } = new List<string>();
        public bool IsShown { get; set; }
        public string Title { get; set; }
        public string ValueSelected { get; set; }

        public Filter(List<string> Options, string Title, string ValueSelected, bool IsShown)
        {
            this.Options = Options;
            this.Title = Title;
            this.ValueSelected = ValueSelected;
            this.IsShown = IsShown;
        }

是: MainContext 我已经定义了列表和按钮。

        public ObservableCollection<Filter> Filters { get; set; } = new ObservableCollection<Filter>();
        public ICommand DoShowHide

在... MainWindow.XAML 在这一点上,我有以下几点。

            <ItemsControl ItemsSource="{Binding Filters}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Vertical" Visibility="{Binding Path=IsShown, Converter={StaticResource BoolToVisConverter} }" Name="MyStackPanel">
                            <TextBlock Text="{Binding Title}"/>
                            <ComboBox ItemsSource="{Binding Path=Options}"
                              SelectedValue="{Binding Path=ValueSelected}" />
                        </StackPanel>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
            <Button Content="Show/Hide" Command="{Binding DoShowHide}"/>

在提到我已经定义了转换器时

<Window.Resources>
   <BooleanToVisibilityConverter x:Key="BoolToVisConverter" />
</Window.Resources>

****我已经尝试设置所有的过滤器。IsShown 属性为true的按钮。不用说没有用......

        private void ShowHide(object obj)
        {
            MessageBox.Show("message");
            foreach(Filter filter in Filters)
            {
                if(filter.IsShown == false)
                {
                    filter.IsShown = true;
                    NotifyPropertyChanged("Filters");
                }
            }
        }

谢谢你花时间阅读我的问题:)

c# wpf mvvm
2个回答
0
投票

筛选器的属性是IsShown = ... Filter 类必须实现 INotifyPropertyChanged. 否则这个类内部的属性变化不会传播到绑定系统。

提高 ProperyChanged 上的事件 Filters 属性,像你这样做,是没有用的。

注意:你可以使用XOR操作来切换布尔值(showhide)。

缩短 Filter 类。

class Filter : INotifyPropertyChanged
{       
  private bool isDisplayed
  public bool IsDisplayed
  {
    get => this.isDisplayed;
    set
    {
      if (value != this.isDisplayed)
      {
        this.isDisplayed = value;
        OnPropertyChanged();
      }
    }
  }

  public event PropertyChangedEventHandler PropertyChanged;

  private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
  { 
    this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));        
  }
}

简称: DataTemplate 对于 Filter 项,修改后的ICommand执行处理程序

<DataTemplate DataType="{x:Type Filter}">
  <StackPanel Visibility="{Binding IsDisplayed, Converter={StaticResource BoolToVisibilityConverter}}">

  </StackPanel>
</DataTemplate>

修改后的ICommand执行处理程序

private void ShowHide(object obj)
{
  // Toggle all Filter.IsDisplayed
  foreach (Filter filter in Filters)
  {
    filter.IsDisplayed ^= true;
  }
}

0
投票

你可以使用转换器来制作,在那里你可以返回一个可见性对象。

© www.soinside.com 2019 - 2024. All rights reserved.