0

我是 Caliburn 和 WPF 的新手,所以如果这是一个相当微不足道的问题,请原谅。

场景如下:我有多个控件(如按钮和文本框 - 后者是重要部分)。它们的状态(启用/禁用)取决于布尔属性。

我尝试的第一个建议方法是使用 Can[FunctionName] 约定和 NotifyOfPropertyChange(() => Can[FunctionName])。它适用于按钮,但不适用于文本框。

如何在不使用 View 的代码隐藏的情况下将 IsEnabled 属性绑定到状态?

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

提前致谢!

4

2 回答 2

3

你试过明显的吗?:

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

更新>>>

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

让我们看看是否Binding真的有效......尝试将您的代码更改为:

<Button Content="{Binding ButtonEnableState}" />

如果Button.Content设置了,那么Binding工作就很好,你有一个不同的问题。

更新 2 >>>

正如@Charleh 提到的,您还需要确保已通知INotifyPropertyChanged接口属性值的更改:

NotifyOfPropertyChange(() => ButtonEnableState);
于 2013-09-04T15:36:18.010 回答
0

我不认为我要建议的一定是正确的做事方式,但它可能会给你你想要的结果。

为了根据Can<name>属性禁用控件,您需要确认 Caliburn 使用的约定,因此在这种情况下,提供函数<name>应该可以工作:

public void TheTextBox()
{
}

由于默认约定,我相信每次KeyDown触发事件时都会调用它。

也就是说,您可能希望将文本内容绑定到某些东西,并且您需要使用x:Name属性约定来选择哪个属性,这意味着您必须以TheTextBox()不同的方式附加该函数,您应该能够做到使用命名空间Message.Attach中的属性Caliburn

所以你的 TextBox 可能看起来像这样(你在其中添加了以下命名空间xmlns:cal="http://www.caliburnproject.org"):

<TextBox cal:Message.Attach="TheTextBox" Name="SomeTextProperty" />

在您的 ViewModel 中备份它,您将拥有:

    // 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; 
    }

然后您应该看到启用/禁用行为,并使用SomeTextProperty.

我不完全确定我喜欢这种做事方式,我只是快速玩了一下,看看它是否有效。以下答案可能是一个更清洁的解决方案,并建立了一个新的可重用约定:

将 IsEnabled 的约定添加到 Caliburn.Micro

顺便说一句(不是直接的答案),根据您的控件/表单的复杂程度,您可以调查使用 multiple Viewsfor the same ViewModel,过去我设置了一个ReadOnly和视图,并在toEditable上使用了一个属性ViewModel在两者之间切换(本质上是设置 的整个状态ViewModel)。已经有默认约定,因此您可以相对轻松地使用多个视图。

于 2013-09-04T16:43:15.360 回答