我有一个属性 List<Filter> Filters
也就是 ItemSource
的 ItemsControl
. 我想达到的目的是在开始时只显示具有以下属性的过滤器 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");
}
}
}
谢谢你花时间阅读我的问题:)
筛选器的属性是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;
}
}
你可以使用转换器来制作,在那里你可以返回一个可见性对象。