【发布时间】:2013-05-07 20:40:38
【问题描述】:
我有一个UserControl,上面有一个CheckBox。当我在 XAML 主页面上使用 UserControl 时,我想将控件上的属性绑定到我的 ViewModel 上的属性,例如
<myUserControl BtnIsBlacklisted="{Binding IsBlacklisted, Mode=TwoWay}" />
当IsBlacklisted 更改时,我希望我的复选框也更改,反之亦然。
这就是我所拥有的,
public static readonly DependencyProperty BtnIsBlacklistedProperty =
DependencyProperty.Register("BtnIsBlacklisted",
typeof(bool),
typeof(MyUserControl),
new PropertyMetadata(false, new
PropertyChangedCallback(BtnIsBlacklistedPropertyChanged))
);
private static void BtnIsBlacklistedPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
// ... do something here ...
}
public bool BtnIsBlacklisted
{
get { return (bool)GetValue(BtnIsBlacklistedProperty); }
set { SetValue(BtnIsBlacklistedProperty, value); }
}
我的 UserControl 有这个用于 CheckBox,
<CheckBox x:Name="myCheckBox"
...
IsChecked="{Binding Path=BtnIsBlacklisted,
ElementName=UserControl,
Converter={StaticResource BoolToNotBool},
Mode=TwoWay}" />
我的 ViewModel 对象上的属性如下,
public bool IsBlacklisted
{
get
{
return App.VM.BlacklistedRetailers.Contains(this.Retailer);
}
set
{
if (value)
{
App.VM.BlacklistedRetailers.Add(this.Retailer);
}
else
{
while (App.VM.BlacklistedRetailers.Contains(this.Retailer))
{
App.VM.BlacklistedRetailers.Remove(this.Retailer);
}
}
this.NotifyPropertyChanged("IsBlacklisted");
}
}
BlacklistedRetailers 更改的唯一方法是通过上面的 set 方法,因此无需从那里触发 NotifyPropertyChanged ...
我已经尝试了其他问题中的许多建议,即
- 使用依赖属性
- 包括
Mode=TwoWay - 使用在包含网格上设置的自引用 DataContext 绑定
UserControl(这也不起作用)。
但是这些都不起作用。
一些最后的笔记:
- 这是针对 Windows Phone 7.5 项目的
-
编辑:一种方式绑定也不起作用,似乎绑定到
UserControl自己的属性有问题
【问题讨论】:
-
你的
BoolToNotBool转换器也是 TwoWay 吗? -
是的。我现在对它做了更多的工作,我发现如果我直接从 UserControl XAML 绑定而不是通过绑定,它就可以工作。 UserControl 属性,例如
IsChecked="{Binding IsBlacklisted, Converter={StaticResource BoolToNotBool}, Mode=TwoWay}"但是这不是很通用,因为它需要知道UserControl中的外部 ViewModel 的名称......我还发现 OneWay 绑定不能正常工作,属性只是因为我设置它们而被更新DependencyPropertyChanged 事件处理程序 - 问题已更新 ...
标签: windows-phone-7 xaml binding user-controls