如何在自定义WPF控件中绑定数据网格列的可见性?

3
我花了整个早上看相关帖子,但我发现没有任何一篇文章涉及到我正在经历的确切问题,尽管在这个过程中我学到了更多。
(在WPF中使用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"/>

非常抱歉,如果我的“新手”表现显而易见的话。但是我这里是否遗漏了某些明显的东西呢?当我在控件xaml.Generic上显式设置可见性属性为Collapsed时,它会正确地隐藏列:

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

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

如果我不能使用相对源,你知道我可以通过其他方式实现这个吗?

System.Windows.Data Error: 2 : 无法为目标元素找到控制 FrameworkElement 或 FrameworkContentElement。BindingExpression:Path=DisplayThirdColumn; DataItem=null; target element is 'CheckBoxColumn' (HashCode=19379515); target property is 'Visibility' (type 'Visibility')


1
列不在同一可视树中,因此无法继承 DataContext。您可以在这里寻找解决方案:https://dev59.com/zGEh5IYBdhLWcg3wvVl4 - Aloraman
3个回答

4
感谢大家的评论和意见,也感谢您抽出时间来阅读!以下是最终结果,如果有人遇到同样的问题,这可能会有所帮助:这篇文章对我很有帮助,但我需要的语法缺少TemplatedParent的相对源:(1)我正在使用一个可消耗控件,并希望在实现控件时设置此可见性。您可以按照上述提到的步骤访问ViewModel上下文。(2)您需要将绑定相对源放置在代理或虚拟元素上(这是我错过的部分)。
... 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}}"



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

创建代理,并将其声明为资源时,将绑定相对源设置为模板父级:
<DataGrid.Resources>
     <controls:ControlProxy x:Key="ControlProxy" Control="{Binding RelativeSource={RelativeSource TemplatedParent}}"/>
</DataGrid.Resources>

1
如果有人遇到了与你相同的问题,你应该将你的答案标记为被接受的答案。 - Maxime Tremblay-Savard

1

0

Visibility 属性不接受 "False" 作为可能的值。如果您想要隐藏控件,您需要编写以下代码:

<CheckBoxColumn Visibility="Collapsed"/>

或者

<CheckBoxColumn Visibility="Hidden"/>

如果您想在C#代码中设置可见性,请编写以下内容:

yourObject.Visibility = Visibility.Collapsed;

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


更新原帖以删除“Visibility =“False””的拼写错误。 - K.DW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接