我是Caliburn和WPF的新手,请原谅我这是一个相当微不足道的问题。
方案如下: 我有多个控件(如按钮和文本框 - 后者是重要的部分)。 它们的状态(Enabled / Disabled)取决于布尔属性。
我尝试的第一个建议方法是使用Can [FunctionName]约定和NotifyOfPropertyChange(()=> Can [FunctionName])。它与按钮配合得很好,但它不适用于文本框。
如何将IsEnabled属性绑定到不使用View的代码隐藏的状态?
我在ViewModel中尝试的代码不适用于文本框:
private bool _buttonEnableState = true;
public bool ButtonEnableState
{
get
{
return _buttonEnableState;
}
set
{
_buttonEnableState = value;
NotifyOfPropertyChange(() => CanTheButton);
NotifyOfPropertyChange(() => CanTheTextBox);
}
}
public bool CanTheButton
{
get
{
return ButtonEnableState;
}
}
public void TheButton()
{
}
public bool CanTheTextBox
{
get
{
return ButtonEnableState;
}
}
从视图:
<Button x:Name="TheButton" Content="This is the button" ... />
<TextBox x:Name="TheTextBox" ... />
提前致谢!
答案 0 :(得分:2)
你有没有试过这个明显的?:
<Button Content="This is the button" IsEnabled="{Binding ButtonEnableState}" />
<TextBox x:Name="TheTextBox" IsEnabled="{Binding ButtonEnableState}" />
更新&gt;&gt;&gt;
所以,继续评论的对话......现在你的public
课程中有AppViewModel
属性,并且该课程的实例被设置为你视图的DataContext
它包含Button
和TextBox
控件?
让我们看看Binding
是否正常工作...尝试将代码更改为:
<Button Content="{Binding ButtonEnableState}" />
如果设置了Button.Content
,则Binding
工作正常,您遇到了其他问题。
更新2&gt;&gt;&gt;
正如@Charleh所提到的,您还需要确保已通知INotifyPropertyChanged
界面更改了属性值:
NotifyOfPropertyChange(() => ButtonEnableState);
答案 1 :(得分:0)
我不认为我所建议的是正确的做事方式,但它可能会给你你想要的结果。
为了根据Can<name>
属性禁用控件,您需要确认Caliburn使用的约定,因此在这种情况下,提供函数<name>
应该起作用:< / p>
public void TheTextBox()
{
}
作为默认约定的结果,我相信每次KeyDown
事件被触发时都会调用它。
也就是说,您可能希望将文本内容绑定到某个内容,并且您希望使用x:Name
属性约定来选择哪个属性,这意味着您必须附加{{1}以不同的方式运行,您应该能够使用TheTextBox()
命名空间中的Message.Attach
属性来执行此操作。
所以你的TextBox看起来像这样(你在那里添加了以下命名空间Caliburn
):
xmlns:cal="http://www.caliburnproject.org"
在ViewModel中备份它,你有:
<TextBox cal:Message.Attach="TheTextBox" Name="SomeTextProperty" />
然后您应该看到启用/禁用行为,并使用 // Your Enabled Property (using your existing code).
public bool CanTheTextBox
{
get
{
return ButtonEnableState;
}
}
// Your dummy function
public void TheTextBox()
{
}
// Some text property (Just for demo, you'd probably want to have more complex logic in the get/set
public string SomeTextProperty
{
get; set;
}
。
我不完全确定我喜欢这种做事方式,我只是快速看看是否有效。以下答案可能是一个更清晰的解决方案,并建立了一个新的可重用惯例:
Adding a convention for IsEnabled to Caliburn.Micro
稍微放弃(不是直接回答),根据您的控件/表单的复杂程度,您可以使用多个SomeTextProperty
调查相同的Views
,过去我已设置查看ViewModel
和ReadOnly
视图,并使用Editable
上的单个属性在两者之间切换(基本上设置ViewModel
的整个状态)。已有默认约定,因此您可以相对轻松地使用多个视图。