c# - 无法使用 Caliburn Micro 绑定(bind)到 ToggleButton 的 IsEnabled 属性

标签 c# wpf windows-phone-8 caliburn.micro

我试图绑定(bind) ToggleButton 的 IsEnabled 属性但没有成功。

一旦 NotifyOfPropertyChange 被触发,我就会收到以下异常:

值不在预期范围内。

使用一个简单的 Button,上述配置按预期工作。

我想知道是否有任何解决方法?

谢谢

更新:

好吧,我花了一段时间才找出问题所在,但最终还是设法理解了行为:

我创建了一个简单的测试器,我在其中使用按钮启用/禁用 ToggleButton

ToggleButton 控件不包含任何内容时,一切正常;然而,在向其添加子控件后(在我们的例子中,我只是添加了一个 StackPanel)引发了一个异常:

值不在预期范围内 - 就在调用 NotifyOfPropertyChange() 之后。

这是我使用的有问题的 View :

<StackPanel>
    <ToggleButton x:Name="SayHello"  Grid.Column="1"  IsEnabled="{Binding HasValue}"  Height="190">
        <StackPanel x:Name="sp"> </StackPanel>
    </ToggleButton>
    <Button x:Name="Click"></Button>
</StackPanel>

ViewModel:

    private bool _hasvalue;

    public bool HasValue
    {
        get { return _hasvalue; }
        set
        {

                _hasvalue = value;
                NotifyOfPropertyChange(() => HasValue);
        }
    }

    public void Click()
    {
        HasValue = !HasValue;
    }

有什么方法可以解决这个问题? - 平台是 WP8。

最佳答案

我无法复制上面示例中的错误,您的 ViewModel 中是否有其他信息?

您还应该能够通过使用 Caliburn.Micro 约定获得您想要的效果(尽管我仍然有兴趣了解错误的根本原因)。 x:Name=sp 是否导致任何东西被绑定(bind)?

如果您有一个方法 SayHello,并且 UI 元素通过约定绑定(bind)到该方法:x:Name="SayHello"

您可以在 ViewModel 上创建一个名为 CanSayHello 的 bool 属性,Caliburn.Micro 将使用它来启用/禁用控件;尽管您必须在该属性更改时调用 NotifyPropertyChanged(以便 UI 知道并可以更新控件)。

例如

<!-- Your existing Control, Note `IsEnabled` is not bound -->
<ToggleButton x:Name="SayHello" Height="40">

// On your ViewModel
public bool CanSayHello
{
    get
    {
        return HasValue;
    }
}

public void Click()
{
    HasValue = !HasValue;
    NotifyOfPropertyChange(() => CanSayHello);
}

Some additional info.

关于c# - 无法使用 Caliburn Micro 绑定(bind)到 ToggleButton 的 IsEnabled 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21440019/

相关文章:

c# - 字符串到 float 与双重转换

c# - 如何检查 WPF 资源是否存在?

wpf - 关于处理 XpsDocument GetFixedDocumentSequence 性能问题的任何建议?

c# - XML 文档的 NullReferenceException

xaml - 在 Windows Phone 8 中创建日历控件

c# - 有人可以在使用 ThreadPool 时解释这种奇怪的行为吗?

c# - 生成软件激活码的最佳方法?

c# - 如何通过 ViewModel 更改 View 中的某些内容

c# - 调试一个简单的碰撞处理器

windows-phone-7 - 在 Windows Phone 7/8 中在后台录制音频流