0

我有一个上面UserControl有一个CheckBox。当我UserControl在我的主 XAML 页面上使用时,我想将控件上的属性绑定到我的 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 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从那里触发...

我已经尝试了其他问题中的许多建议,即

  1. 使用依赖属性
  2. 包含Mode=TwoWay
  3. 使用包含网格上设置的自引用 DataContext 进行绑定UserControl(这也不起作用)。

但是这些都没有奏效。

一些最后的笔记:

  • 这是一个 Windows Phone 7.5 项目
  • 编辑:一种方式绑定也不起作用,似乎绑定到UserControl自己的属性有问题
4

1 回答 1

1

与设置绑定的元素同名范围内的值匹配ElementName Bindingx:Name显示的代码不足以说明,但您使用的是“UserControl”,我猜它没有设置为元素的名称,而是用于尝试匹配类型。如果在模板中声明,ElementName也可能无法解析。CheckBox

于 2013-05-14T12:47:57.440 回答