将文本框的可见性绑定到内容模板中的视图模型 属性
Bind visibility of text box to view model property in a content template
我只是想在 GridViewColumnHeader.ContentTemplate 中将文本框设置为折叠。我相信一切都在正确完成,但由于某种原因,当设置布尔值 属性 时,文本框不会折叠。
信息
- 我有一个视图,其视图模型具有 FilterRows 布尔值 属性。
- 我正在设计我的网格视图以允许用户设置 FilterRows 属性 并为每个 header 显示过滤器。
- 我试过使用 BooleanToVisibilityConverter 和 BooleanToCollapsedConverter。
- 我已经验证了当用户选中一个复选框时在视图模型中设置了 bool。
BooleanToCollapsedConverter
此转换器与我的网格视图处于同一视图 table。我知道转换器有效,因为我在同一视图中的其他 UI 元素上使用了它。
<Grid.Resources>
<ResourceDictionary>
<local:BooleanToCollapsedConverter x:Key="BooleanToCollapsedConverter"/>
</ResourceDictionary>
</Grid.Resources>
这是 booleanToCollapsedConverter
的 class
public class BooleanToCollapsedConverter : BaseValueConverter<BooleanToCollapsedConverter>
{
public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (bool)value ? Visibility.Visible : Visibility.Collapsed;
}
public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
景色
这是我尝试在样式中使用转换器的网格视图列的一部分的代码。 GridViewColumnHeader 可见性已正确设置并根据需要折叠。带有数据模板的内部部分不起作用。
<GridViewColumn DisplayMemberBinding = "{Binding Description}"
Width="auto">
<GridViewColumnHeader Content = "Description"
Visibility="{Binding HeaderList[1].IsChecked, Converter={StaticResource BooleanToCollapsedConverter}}"
local:GridViewBehaviors.CollapseableColumn="True">
<GridViewColumnHeader.ContentTemplate>
<DataTemplate>
<StackPanel>
<TextBox Height = "25"
FontSize="{StaticResource FontSizeSmall}"
Visibility="{Binding FilterRows, Converter={StaticResource BooleanToCollapsedConverter}}"/>
<TextBlock Text = "Description" ></ TextBlock >
</ StackPanel >
</ DataTemplate >
</ GridViewColumnHeader.ContentTemplate >
</ GridViewColumnHeader >
</ GridViewColumn >
视图模型
这是我在视图模型中的布尔值 属性。
/// <summary>
/// True if the user wants to apply filters to the rows.
/// Once set the UI will display all filters
/// </summary>
public bool FilterRows
{
get => _filterRows;
set => Set(ref _filterRows, value);
}
最终分数
因此,总的来说,当我选中“筛选行:”复选框时,我只是在字面上试图折叠该文本框。不知道是风格问题还是我操作不当?任何帮助将不胜感激!
谢谢
尝试为文本框绑定设置数据源。 How do I use WPF bindings with RelativeSource?
像这样。 typeOfAncestor 是 UserControl 或 Window
{Binding FilterRows, Converter={StaticResource BooleanToCollapsedConverter},
RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}}
如果定义 FilterRows
属性 的视图模型是父 DataGrid
的 DataContext
,这应该有效:
<TextBox Height="25" FontSize="{StaticResource FontSizeSmall}"
Visibility="{Binding DataContext.FilterRows,
RelativeSource={RelativeSource AncestorType=DataGrid},
Converter={StaticResource BooleanToCollapsedConverter}}"/>
另请注意,有一个用于在 bool
和 Visibility
之间进行转换的内置转换器,您可以使用它来代替创建自己的转换器:
<BooleanToVisibilityConverter x:Key="BooleanToCollapsedConverter" />
我只是想在 GridViewColumnHeader.ContentTemplate 中将文本框设置为折叠。我相信一切都在正确完成,但由于某种原因,当设置布尔值 属性 时,文本框不会折叠。
信息
- 我有一个视图,其视图模型具有 FilterRows 布尔值 属性。
- 我正在设计我的网格视图以允许用户设置 FilterRows 属性 并为每个 header 显示过滤器。
- 我试过使用 BooleanToVisibilityConverter 和 BooleanToCollapsedConverter。
- 我已经验证了当用户选中一个复选框时在视图模型中设置了 bool。
BooleanToCollapsedConverter
此转换器与我的网格视图处于同一视图 table。我知道转换器有效,因为我在同一视图中的其他 UI 元素上使用了它。
<Grid.Resources>
<ResourceDictionary>
<local:BooleanToCollapsedConverter x:Key="BooleanToCollapsedConverter"/>
</ResourceDictionary>
</Grid.Resources>
这是 booleanToCollapsedConverter
的 classpublic class BooleanToCollapsedConverter : BaseValueConverter<BooleanToCollapsedConverter>
{
public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (bool)value ? Visibility.Visible : Visibility.Collapsed;
}
public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
景色
这是我尝试在样式中使用转换器的网格视图列的一部分的代码。 GridViewColumnHeader 可见性已正确设置并根据需要折叠。带有数据模板的内部部分不起作用。
<GridViewColumn DisplayMemberBinding = "{Binding Description}"
Width="auto">
<GridViewColumnHeader Content = "Description"
Visibility="{Binding HeaderList[1].IsChecked, Converter={StaticResource BooleanToCollapsedConverter}}"
local:GridViewBehaviors.CollapseableColumn="True">
<GridViewColumnHeader.ContentTemplate>
<DataTemplate>
<StackPanel>
<TextBox Height = "25"
FontSize="{StaticResource FontSizeSmall}"
Visibility="{Binding FilterRows, Converter={StaticResource BooleanToCollapsedConverter}}"/>
<TextBlock Text = "Description" ></ TextBlock >
</ StackPanel >
</ DataTemplate >
</ GridViewColumnHeader.ContentTemplate >
</ GridViewColumnHeader >
</ GridViewColumn >
视图模型
这是我在视图模型中的布尔值 属性。
/// <summary>
/// True if the user wants to apply filters to the rows.
/// Once set the UI will display all filters
/// </summary>
public bool FilterRows
{
get => _filterRows;
set => Set(ref _filterRows, value);
}
最终分数
因此,总的来说,当我选中“筛选行:”复选框时,我只是在字面上试图折叠该文本框。不知道是风格问题还是我操作不当?任何帮助将不胜感激!
谢谢
尝试为文本框绑定设置数据源。 How do I use WPF bindings with RelativeSource?
像这样。 typeOfAncestor 是 UserControl 或 Window
{Binding FilterRows, Converter={StaticResource BooleanToCollapsedConverter},
RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}}
如果定义 FilterRows
属性 的视图模型是父 DataGrid
的 DataContext
,这应该有效:
<TextBox Height="25" FontSize="{StaticResource FontSizeSmall}"
Visibility="{Binding DataContext.FilterRows,
RelativeSource={RelativeSource AncestorType=DataGrid},
Converter={StaticResource BooleanToCollapsedConverter}}"/>
另请注意,有一个用于在 bool
和 Visibility
之间进行转换的内置转换器,您可以使用它来代替创建自己的转换器:
<BooleanToVisibilityConverter x:Key="BooleanToCollapsedConverter" />