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