将 BooleanToVisibilityConverter 绑定到 TreeView HierarchicalDataTemplate 中的控件
Binding BooleanToVisibilityConverter to a Control in a TreeView HierarchicalDataTemplate
我有一个绑定到数据集的 TreeView 对象。在 TreeView.ItemTemplate 中,我使用的是包含我正在呈现的控件的 HierarchicalDataTemplate。
有人知道如何更改 HierarchicalDataTemplate 中控件的 Visibility 属性吗? 我试过使用 .NET 框架中的 BooleanToVisibilityConverter,但无法绑定到好好工作。
我的 ViewModel 中名为“moveButtonVisibility”的布尔变量绑定到我的 XAML 中按钮的 Visibility 属性。 BooleanToVisibilityConverter 然后尝试将相应的布尔值 (true/false) 转换为 Visibility 值 (visible/hidden)。 “moveButtonVisibility”不是 TreeView 的 ItemSource 的一部分。
我的代码的精简版本如下所示。我已经删除了 XAML 中的所有代码,除了按钮控件 "MoveHereButton",我想更改它的可见性属性:
VIEWMODEL (C#):
private bool _moveButtonVisibility;
public bool moveButtonVisibility
{
get { return _moveButtonVisibility; }
set
{
_moveButtonVisibility = value;
RaiseChange("moveButtonVisibility");
}
}
VIEW (XAML):
<Page>
<Page.Resources>
<BooleanToVisibilityConverter x:Key="visibilityConverter"/>
</Page.Resources>
<Grid HorizontalAlignment="Center" VerticalAlignment="Top">
<TreeView HorizontalAlignment="Center" x:Name="treeView1" VerticalAlignment="Top" ItemsSource="{Binding Path=rsParentChild}" Background="Transparent" BorderThickness="0" BorderBrush="Transparent" >
<TreeView.ItemContainerStyle>
<Style>
<Setter Property="TreeViewItem.IsExpanded" Value="True"/>
</Style>
</TreeView.ItemContainerStyle>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=rsParentChild, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<Grid Focusable="False" Margin="5,10,5,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Name="MoveHereButton" Content="Move Here" Visibility="{Binding DataContext.moveButtonVisibility, Converter={StaticResource visibilityConverter}}" Click="MoveHereButton_Click" />
</Grid>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</Grid>
</Page>
以下有效:
<Button Name="MoveHereButton"
Content="Move Here"
Visibility="{Binding DataContext.moveButtonVisibility,
RelativeSource={RelativeSource AncestorType={x:Type Page}},
Converter={StaticResource visibilityConverter}}"
Click="MoveHereButton_Click" />
关键是要添加:
RelativeSource={RelativeSource AncestorType={x:Type Page}}
在 Visibility
绑定中强制控件使用 Page
的 DataContext
。
我有一个绑定到数据集的 TreeView 对象。在 TreeView.ItemTemplate 中,我使用的是包含我正在呈现的控件的 HierarchicalDataTemplate。
有人知道如何更改 HierarchicalDataTemplate 中控件的 Visibility 属性吗? 我试过使用 .NET 框架中的 BooleanToVisibilityConverter,但无法绑定到好好工作。
我的 ViewModel 中名为“moveButtonVisibility”的布尔变量绑定到我的 XAML 中按钮的 Visibility 属性。 BooleanToVisibilityConverter 然后尝试将相应的布尔值 (true/false) 转换为 Visibility 值 (visible/hidden)。 “moveButtonVisibility”不是 TreeView 的 ItemSource 的一部分。
我的代码的精简版本如下所示。我已经删除了 XAML 中的所有代码,除了按钮控件 "MoveHereButton",我想更改它的可见性属性:
VIEWMODEL (C#):
private bool _moveButtonVisibility;
public bool moveButtonVisibility
{
get { return _moveButtonVisibility; }
set
{
_moveButtonVisibility = value;
RaiseChange("moveButtonVisibility");
}
}
VIEW (XAML):
<Page>
<Page.Resources>
<BooleanToVisibilityConverter x:Key="visibilityConverter"/>
</Page.Resources>
<Grid HorizontalAlignment="Center" VerticalAlignment="Top">
<TreeView HorizontalAlignment="Center" x:Name="treeView1" VerticalAlignment="Top" ItemsSource="{Binding Path=rsParentChild}" Background="Transparent" BorderThickness="0" BorderBrush="Transparent" >
<TreeView.ItemContainerStyle>
<Style>
<Setter Property="TreeViewItem.IsExpanded" Value="True"/>
</Style>
</TreeView.ItemContainerStyle>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=rsParentChild, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<Grid Focusable="False" Margin="5,10,5,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Name="MoveHereButton" Content="Move Here" Visibility="{Binding DataContext.moveButtonVisibility, Converter={StaticResource visibilityConverter}}" Click="MoveHereButton_Click" />
</Grid>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</Grid>
</Page>
以下有效:
<Button Name="MoveHereButton"
Content="Move Here"
Visibility="{Binding DataContext.moveButtonVisibility,
RelativeSource={RelativeSource AncestorType={x:Type Page}},
Converter={StaticResource visibilityConverter}}"
Click="MoveHereButton_Click" />
关键是要添加:
RelativeSource={RelativeSource AncestorType={x:Type Page}}
在 Visibility
绑定中强制控件使用 Page
的 DataContext
。