WPF 绑定到 Listview 的 Itemtemplate 的可见性不起作用
WPF binding to Visibility of an Itemtemplate of a Listview not working
我正在使用 WPF Prism.Mvvm。
我在包含绑定到 Itemssource 的 Listview 的一侧有一个导航栏。这些项目包含图像和内容。现在我的目标是折叠项目的内容,以便我的导航控件只显示图标。
我已经定义了一个可见性绑定,在我的 Listview 之外的一些图像上使用它,效果很好。但是,一旦我尝试对 Listview 的项目模板中的任何内容使用该精确绑定,就没有任何反应。
有趣的是,如果我在没有绑定的情况下将 Visibility 设置为 Collapsed myself,它又会起作用。
这是我的观点
<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}}"
复制到该 Itemtemplate 上方的任何内容,例如 Listview 本身或 Stackpanel,它的工作方式与 Listview 下的图像相同。但是 Listview.ItemTemplate 中的文本块、图像或网格本身不会响应我的绑定。将它设置为 Visibility="Collapsed"
然而,正如我希望的那样工作。
我的视图模型:
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;
}
ListView.ItemTemplate 是 MenuItem 对象的模板。我想 Visibility
不是 MenuItem class 的 属性,它属于另一个视图模型。所以你需要从不同的 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 Prism.Mvvm。 我在包含绑定到 Itemssource 的 Listview 的一侧有一个导航栏。这些项目包含图像和内容。现在我的目标是折叠项目的内容,以便我的导航控件只显示图标。
我已经定义了一个可见性绑定,在我的 Listview 之外的一些图像上使用它,效果很好。但是,一旦我尝试对 Listview 的项目模板中的任何内容使用该精确绑定,就没有任何反应。 有趣的是,如果我在没有绑定的情况下将 Visibility 设置为 Collapsed myself,它又会起作用。
这是我的观点
<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}}"
复制到该 Itemtemplate 上方的任何内容,例如 Listview 本身或 Stackpanel,它的工作方式与 Listview 下的图像相同。但是 Listview.ItemTemplate 中的文本块、图像或网格本身不会响应我的绑定。将它设置为 Visibility="Collapsed"
然而,正如我希望的那样工作。
我的视图模型:
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;
}
ListView.ItemTemplate 是 MenuItem 对象的模板。我想 Visibility
不是 MenuItem class 的 属性,它属于另一个视图模型。所以你需要从不同的 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" />