根据状态禁用多个控件

时间:2013-09-04 15:30:28

标签: c# wpf caliburn.micro

我是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" ... />

提前致谢!

2 个答案:

答案 0 :(得分:2)

你有没有试过这个明显的?:

<Button Content="This is the button" IsEnabled="{Binding ButtonEnableState}" />
<TextBox x:Name="TheTextBox" IsEnabled="{Binding ButtonEnableState}" />

更新&gt;&gt;&gt;

所以,继续评论的对话......现在你的public课程中有AppViewModel属性,并且该课程的实例被设置为你视图的DataContext它包含ButtonTextBox控件?

让我们看看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,过去我已设置查看ViewModelReadOnly视图,并使用Editable上的单个属性在两者之间切换(基本上设置ViewModel的整个状态)。已有默认约定,因此您可以相对轻松地使用多个视图。