绑定文本框的可见性以查看内容模板中的模型属性

时间:2019-01-03 16:21:20

标签: c# wpf xaml data-binding converters

我只是想在GridViewColumnHeader.ContentTemplate中设置一个折叠的文本框。我相信所有操作都可以正确完成,但是由于某种原因,设置boolean属性时,文本框不会折叠。

信息

  • 我有一个视图,该视图的视图模型具有FilterRows布尔属性。
  • 我正在设置网格视图的样式,以允许用户设置FilterRows属性并为每个标题显示过滤器。
  • 我尝试使用BooleanToVisibilityConverter和BooleanToCollapsedConverter。
  • 我已经验证了当用户选中复选框时,是否在视图模型中设置了布尔值。

BooleanToCollapsedConverter

此转换器与我的网格视图表的视图相同。我知道转换器可以工作,因为我已经在同一视图中的其他UI元素上使用了它。

   <Grid.Resources>
       <ResourceDictionary>
           <local:BooleanToCollapsedConverter x:Key="BooleanToCollapsedConverter"/>
       </ResourceDictionary>
   </Grid.Resources>

这是booleanToCollapsedConverter的类

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);
    }

enter image description here

最终点

因此,总的来说,当我选中“筛选器行:”复选框时,我实际上只是在试图折叠该文本框。不确定是与样式有关还是我做的不当?任何帮助将不胜感激!

谢谢

2 个答案:

答案 0 :(得分:2)

尝试设置文本框绑定的数据源。 How do I use WPF bindings with RelativeSource?

像这样的东西。 typeOfAncestor是UserControl或Window

{Binding FilterRows, Converter={StaticResource BooleanToCollapsedConverter},
RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}}

答案 1 :(得分:0)

如果定义了FilterRows属性的视图模型是父级DataContext的{​​{1}},那么这应该起作用:

DataGrid

还请注意,您可以使用内置的转换器在<TextBox Height="25" FontSize="{StaticResource FontSizeSmall}" Visibility="{Binding DataContext.FilterRows, RelativeSource={RelativeSource AncestorType=DataGrid}, Converter={StaticResource BooleanToCollapsedConverter}}"/> bool之间进行转换,而不用创建自己的转换器:

Visibility