如何在自定义wpf控件上绑定datagrid列的可见性?

时间:2015-06-08 18:13:42

标签: c# wpf binding visibility

我早上看了相关的帖子,其中没有人我找到了解决我正在经历的确切问题,虽然我已经学到了更多的东西。

(在MVF中使用MVVM和用户控件)

场景:我需要创建一个可重用的控件,它是一个数据网格,根据表单要求显示两列或三列。我有一个我已经创建的自定义控件,以及用于隐藏/显示第三列选项的依赖项属性:

*注意:这种可见性完全取决于我设置属性的内容,我从不需要根据其他区域的选择进行更改。

public class MyCustomControl: Control
{
    public static readonly DependencyProperty DisplayThirdColumnProperty = DependencyProperty.Register(
                                                                                        "DisplayThirdColumn",
                                                                                        typeof(bool),
                                                                                        typeof(MyCustomControl),
                                                                                        new FrameworkPropertyMetadata(false));

    static MyCustomControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl), new FrameworkPropertyMetadata(typeof(MyCustomControl)));
    }

    /// <summary>
    /// Gets or sets a value indicating whether the the third column should display.
    /// </summary>
    public bool DisplayThirdColumn
    {
        get
        {
            return (bool)this.GetValue(DisplayThirdColumnProperty);
        }
        set
        {
            this.SetValue(DisplayThirdColumnProperty, value);
        }
    }
}

这是xaml.Generic:

<CheckBoxColumn Binding="{Binding StuffInThirdColumn}"
                Header="ThirdColumn" 
                Visibility="{Binding DisplayThirdColumn, 
                Converter={StaticResource BooleanToVisibilityConverter},RelativeSource={RelativeSource TemplatedParent}}"/>

现在当我使用控件时:

<MyControls:MyCustomControl DisplayThirdColumn="False"/>

如果我的'新手'出现了,我很抱歉,但我错过了一些明显的东西吗?当我将Visiblity属性设置为在控件xaml.Generic上显式折叠时,它正确隐藏了列:

<CheckBoxColumn Visibility="Collapsed"..../>

输出窗口似乎表明它无法找到要应用它的元素。

如果我不能使用相对来源,你知道另一种方法吗?

  

System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement。 BindingExpression:路径= DisplayThirdColumn;的DataItem = NULL; target元素是'CheckBoxColumn'(HashCode = 19379515);目标属性是“可见性”(类型“可见性”)

3 个答案:

答案 0 :(得分:3)

感谢大家的意见和建议,以及花一分钟时间(我随时欢迎您的光临!)

这是最终结果,如果有人遇到这个问题,最终会有什么工作:

This post提供了很多帮助,但我需要的语法缺少TemplatedParent的相对来源:

(1)我正在使用耗材控件,并希望能够在实现控件时设置此可见性。您可以使用上述帖子中的步骤访问ViewModel上下文。

(2)你需要在代理或虚拟元素(这是我缺少的部分)上将绑定相对源放到TemplatedParent

... In a ControlTemplate:

    <FrameworkElement x:Name="dummyElementToGetDataContext"
                        DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}"
                        Visibility="Collapsed" />
        <DataGrid>
           <DataGrid.Columns>
            ......
           <CheckBoxColumn Binding="{Binding SecondColumnStuff}"
                            Visibility="{Binding DataContext.ShouldDisplaySecondColumn,
                                         Converter={StaticResource BooleanToVisibilityConverter},
                                         Source={x:Reference dummyElementToGetDataContext}}"



 .............

OR

创建代理并在将此声明为资源时,将绑定相对源设置为模板化父代:

<DataGrid.Resources>
     <controls:ControlProxy x:Key="ControlProxy" Control="{Binding RelativeSource={RelativeSource TemplatedParent}}"/>
</DataGrid.Resources>

答案 1 :(得分:1)

我会将visibility属性绑定到ViewModel中的boolean,并使用VisibilityConverter,请参阅the Java 7 docs for String.hashCode()

这意味着如果我们绑定的布尔属性为<div class="js-modal-additional hidden-node" data-reposition="0" data-css="{" position":"fixed","z-index":3,"top":"auto"}"> </div> ,则它将转换为true,如果为false,则转换为Visibility.Visible

答案 2 :(得分:0)

可见性属性不会错误&#34;错误&#34;作为可能的价值。如果你想隐藏你的控件,你需要写:

<CheckBoxColumn Visibility="Collapsed"/>

<CheckBoxColumn Visibility="Hidden"/>

如果要在c#代码中设置可见性,请写:

yourObject.Visibility = Visibility.Collapsed;

如果您需要有关可见性属性及其所有可能值的更多信息,请访问:https://msdn.microsoft.com/en-us/library/system.windows.visibility(v=vs.110).aspx