WPF绑定到Listview的Itemtemplate的可见性不起作用[重复]

Posted

技术标签:

【中文标题】WPF绑定到Listview的Itemtemplate的可见性不起作用[重复]【英文标题】:WPF binding to Visibility of an Itemtemplate of a Listview not working [duplicate] 【发布时间】:2018-12-22 12:20:36 【问题描述】:

我正在使用 WPF Prism.Mvvm。 我在一侧有一个导航栏,其中包含一个绑定到 Itemssource 的 Listview。这些项目包含图像和内容。现在我的目标是折叠项目的内容,以便我的导航控件只显示图标。

我已经定义了一个可见性绑定,在我的 Listview 之外的一些图像上使用它,它完美地工作。但是,一旦我尝试在 Listview 的 itemtemplate 中的任何内容上使用该精确绑定,什么都不会发生。 有趣的是,如果我在没有绑定的情况下将 Visibility 设置为 Collapsed,它会再次起作用。

这是我的观点

<UserControl.Resources>
    <ResourceDictionary>
        <BooleanToVisibilityConverter x:Key="booleanToVisibilityConverter" />
    </ResourceDictionary>

[...]

<DockPanel >
    <ContentControl DockPanel.Dock="Top">
        <StackPanel>
            <Button Margin="5,5,5,5" Style="StaticResource MyButton" Command="Binding ExpandMenuCommand" Content="Menu" HorizontalAlignment="Left" Width="43.017" />
            <ListView  BorderThickness="0" VerticalContentAlignment="Top" SelectionMode="Single" ItemsSource="Binding MenuItems" SelectedItem="Binding SelectedItem" Background="Transparent">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <Grid VerticalAlignment="Center">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*" />
                                <ColumnDefinition Width="*" />
                            </Grid.ColumnDefinitions>
                            <Image Margin="0,10,0,10" Grid.Column="0" Source="Binding ImageSource" />
                            <TextBlock Visibility="Binding Visibility, Converter=StaticResource booleanToVisibilityConverter" VerticalAlignment="Center" Margin="10,10,10,10" Grid.Column="1" Text="Binding Content" Background="Transparent" FontFamily="Arial" FontWeight="Bold" />
                        </Grid>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </StackPanel>
    </ContentControl>
    <ContentControl DockPanel.Dock="Bottom">
        <Grid>
            <Image Visibility="Binding Visibility, Converter=StaticResource booleanToVisibilityConverter" HorizontalAlignment="Center" Height="59" Margin="19,0,0,25" Width="182" Source="/ModuleA;component/Images/Logo.png" VerticalAlignment="Bottom" />
        </Grid>
    </ContentControl>
</DockPanel>

现在,如果我将Visibility="Binding Visibility, Converter=StaticResource booleanToVisibilityConverter" 复制到该项目模板上方的任何内容,比如 Listview 本身或 Stackpanel,它的工作原理就像它对 Listview 下的图像所做的那样。但是 Listview.ItemTemplate 中的文本块、图像或网格本身不会响应我的绑定。将其设置为 Visibility="Collapsed"however 就像我想要的那样工作。

我的视图模型:

private static bool _expanded = true;

private bool _visibility = _expanded;

public bool Visibility

    get  return _visibility; 
    set  SetProperty(ref _visibility, value); 



    private void ExpandMenu()
    
        _expanded = !_expanded;
        Visibility = _expanded;
    

【问题讨论】:

【参考方案1】:

ListView.ItemTemplate 是 MenuItem 对象的模板。我想Visibility 不是 MenuItem 类的属性,它属于另一个视图模型。所以你需要从不同的DataContext绑定它:

<TextBlock Visibility="Binding DataContext.Visibility, 
                                Converter=StaticResource booleanToVisibilityConverter, 
                                RelativeSource=RelativeSource AncestorType=ListView" 
           VerticalAlignment="Center" 
           Margin="10,10,10,10" Grid.Column="1" 
           Text="Binding Content" 
           Background="Transparent" 
           FontFamily="Arial" 
           FontWeight="Bold" />

【讨论】:

以上是关于WPF绑定到Listview的Itemtemplate的可见性不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将 wpf listview 绑定到数据集......可能......?

WPF绑定到Listview的Itemtemplate的可见性不起作用[重复]

WPF ListView 中的多维绑定

C# WPF - Listview 绑定不起作用

WPF - ListView 为空时不显示上下文菜单

如何将 Dictionary<enum, bool> 双向绑定到 WPF 中的 ListView 列?