我的WPF应用程序现在有一个很糟糕的问题......
我有一个自定义UserControl用于编辑组件的详细信息。它应该从未启用开始,并在用户选择要编辑的组件后立即启用。
问题是:IsEnabled属性甚至没有改变。
这是我的代码:
<my:UcComponentEditor Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
IsEnabled="{Binding EditorEnabled}"
DataContext="{Binding VmComponent}" />
EditorEnabled是我的ViewModel(VmComponent)中的属性,默认情况下为false,当用户选择组件或创建一个组件时,该属性变为true
仅供记录,在我的ViewModel中:
private Boolean _editorEnabled = false;
public Boolean EditorEnabled
{
get { return _editorEnabled; }
set
{
_editorEnabled = value;
OnPropertyChanged("EditorEnabled");
}
}
当我尝试启动我的应用时,UserControl正在启动...已启用。 我到处都添加了断点,编辑器从一开始就是假的。
我还做了一个非常愚蠢的事情,试图弄清楚发生了什么:我创建了一个转换器(非常有用 - 将布尔值转换为布尔值 - 呃),在它上面加一个断点,然后......代码是从未到过。
<my:UcComponentEditor Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
IsEnabled="{Binding EditorEnabled, Converter={StaticResource BoolConverter}}"
DataContext="{Binding VmComponent}" />
这可能意味着永远不会设置属性isEnabled,因为永远不会到达转换器。
你知道那里有什么问题吗?我大约一周前开始在WPF工作,因此我可能错过了一些必要的东西......非常感谢你的时间: - )
答案 0 :(得分:2)
您应该为绑定添加DependencyProperty才能正常工作。 See here for more information.
代码隐藏:
public static readonly DependencyProperty EditorEnabledDependencyProperty = DependencyProperty.Register("EditorEnabled", typeof(bool), typeof(UcComponentEditor), new PropertyMetadata(false));
public bool EditorEnabled
{
get { return (bool)base.GetValue(UcComponentEditor.EditorEnabledDependencyProperty); }
set { base.SetValue(UcComponentEditor.EditorEnabledDependencyProperty, value); }
}
答案 1 :(得分:1)
我认为问题是用户控件的DataContext属性存在绑定。这意味着EditorEnabled属性应该是VmComponent对象中的属性。至少这就是我的问题所在。
为了解决这个问题,我为IsEnabled的绑定指定了一个合适的来源。一旦我这样做,控制开始按预期工作。
希望有所帮助。
答案 2 :(得分:0)
将控件封装在DockPanel中(例如)将不再需要DependencyProperty。
然后,您可以使用dockpanel而不是自定义控件进行绑定。在Dockpanel上设置绑定到IsEnabled的变量将自动启用或禁用Dockpanel中包含的项目。