我早上看了相关的帖子,其中没有人我找到了解决我正在经历的确切问题,虽然我已经学到了更多的东西。
(在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);目标属性是“可见性”(类型“可见性”)
答案 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