这已经困扰我很长一段时间了。因此,我有一个在其ItemsControl数据模板中显示自定义用户控件(自定义控件)的ListView。因此,基本上,列表项存储在一个控件中,该控件有自己的ViewModel,独立于ListView ViewModel。我的自定义控件有一个文本和一个按钮。单击自定义控件的按钮将显示特定于该控件的列表(此部分工作正常)。我想要实现的功能是单击自定义控件的按钮,并隐藏列表视图(父级)中的所有其他项,然后单击相同的按钮以恢复其他项的可见性。
仅仅在DataTemplate中设置自定义控件的可见性是行不通的,因为我想直接从自定义控件中的Button click事件设置可见性。
在这方面的任何帮助都将非常感谢。
发布于 2018-04-18 01:30:25
假设您有一个想要更改可见性的控件,那么让我们将它绑定到我们类中一个名为IsVisible的字段。
<Button Grid.Column="1" Grid.Row="3" Content="Hide Stuff" Command="{Binding HideStuffCommand}"></Button>
<ListView Grid.Column="1" Grid.Row="4" ItemsSource="{Binding People}">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsVisible}" Value="Collapsed">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
<DataTrigger Binding="{Binding IsVisible}" Value="Visible">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}"></TextBlock>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>我们使用这个类:
public class Person: ViewModelBase
{
private int _Id;
public int Id
{
get { return _Id; }
set { this.Set(ref _Id, value); }
}
private string _Name;
public string Name
{
get { return _Name; }
set { this.Set(ref _Name, value); }
}
private Visibility _IsVisible;
public Visibility IsVisible
{
get { return _IsVisible; }
set { this.Set(ref _IsVisible, value); }
}
public Person(int id, string name)
{
this.Id = id;
this.Name = name;
this.IsVisible = Visibility.Visible;
}
}我使用的是MVVM Light,所以this.Set会处理更改后的raise属性。
现在你的click事件:
public RelayCommand HideStuffCommand { get; private set; }
public void HideStuff()
{
foreach (var t in People)
{
if (t.Id % 2 == 0)
{
t.IsVisible = t.IsVisible == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
}
}
}在你的视图模型构造函数中:
People = new ObservableCollection<Person>();
People.Add(new Person(1, "Fred"));
People.Add(new Person(2, "Wilma"));
People.Add(new Person(3, "Barney"));
People.Add(new Person(4, "Betty"));
this.HideStuffCommand = new RelayCommand(HideStuff);https://stackoverflow.com/questions/49883747
复制相似问题