我有一个WPF XAML ListView,它包含一个带有两个GridViewColumns的GridView。 ListView将其ItemsSource绑定到我的类,如下所示:
<ListView Name="MyListView" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type mynameSpace:MyClass}}, Path=ItemsSource}" >
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}" BasedOn="{StaticResource ListViewItemStyle}">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="VerticalContentAlignment" Value="Stretch"/>
<!--<Setter Property="Visibility" Value="{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled, Converter={StaticResource BoolToVisibility}}"></Setter>-->
<Setter Property="Visibility" Value="{Binding Path=IsEnabled, Converter={StaticResource BoolToVisibility}}"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
// blah blah
</GridView>
</ListView>
我试图隐藏基于属性IsEnabled的ListView项目,所以我尝试了上面的两个方法,但两个方法都没有工作,因为该项仍然出现在ListView中:
<Setter Property="Visibility" Value="{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled, Converter={StaticResource BoolToVisibility}}"></Setter>
<Setter Property="Visibility" Value="{Binding Path=IsEnabled, Converter={StaticResource BoolToVisibility}}"/>
如何隐藏列表视图中的项目?
答案 0 :(得分:0)
而不是:
<Setter Property="Visibility" Value="{Binding Path=IsEnabled, Converter={StaticResource BoolToVisibility}}"/>
写下这个:
<Setter Property="Visibility" Value="{Binding IsEnabled, Converter={StaticResource BoolToVisibility}, Mode=TwoWay}"/>
确保在ViewModel中有 RaisePropertyChanged(&#34; IsEnabled&#34;); :
private bool _isEnabled;
public bool IsEnabled
{
get { return _isEnabled; }
set
{
_isEnabled = value;
RaisePropertyChanged("IsEnabled");
}
}
另外,不要忘记写这个&#34; XXX&#34;是您当前的View作为UserControl,Window等等:
<XXX.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVis"></BooleanToVisibilityConverter>
</XXX.Resources>
编辑1
不要忘记将ViewModel作为DataContext链接到View中(使用ViewModelLocator),如:
<XXX
...
DataContext="{Binding MyCustomViewModel, Mode=OneWay, Source={StaticResource Locator}}"
...>
您的定位器在App.xaml中设置为ResourceDictionnary:
...
<ResourceDictionary>
...
<XX:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
...
</ResourceDictionary>
...
答案 1 :(得分:0)
实际上有一种替代方法可以解决任何XAML代码或集合本身。
通过利用源集合的CollectionView,您可以过滤项目(并执行其他操作,如排序和分组),而无需更改视图或模型。因为在wpf ui元素中永远不会直接访问集合,而是通过集合视图。该集合视图继承自ICollectionView,可以自动设置,也可以由程序员设置。
要初始化数据,要进入默认集合视图,请在某处使用以下代码。
var collectionView = CollectionViewSource.GetDefaultView(<List>);
collectionView.Filter = o => o.IsEnabled;
编辑: Nervermind,我没有看到基于xaml的解决方案的要求。
答案 2 :(得分:0)
IsEnabled
属性定义在哪里,你的&#34; ListViewItemStyle&#34;定义和你使用的转换器?
您还没有提供可重现的问题示例,但您可以参考以下示例代码,该代码会按预期隐藏ListView中的三个项目中的第二个:
public class DataItem
{
public bool IsEnabled { get; set; }
}
...
public MainWindow()
{
InitializeComponent();
MyListView123.ItemsSource = new List<DataItem>
{
new DataItem() { IsEnabled = true }, new DataItem() { IsEnabled = false }, new DataItem() { IsEnabled = true }
};
}
<ListView Name="MyListView123">
<ListView.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVisibility" />
</ListView.Resources>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="Visibility" Value="{Binding Path=IsEnabled, Converter={StaticResource BoolToVisibility}}"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding IsEnabled}" />
</GridView>
</ListView.View>
</ListView>