2013-05-13 2 views
0

У меня есть UserControl, у которого есть CheckBox. Когда я использую UserControl на моей главной странице XAML, я бы хотел, чтобы TwoWay привязывал свойство элемента управления к свойству на моем ViewModel, например.Как связать TwoWay между CheckBox в 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 изменяется через установленный метод выше, поэтому нет необходимости запускать NotifyPropertyChanged оттуда ...

Я пробовал много предложений других вопросов, то есть

  1. используя свойство зависимостей
  2. включая Mode=TwoWay
  3. Binding на UserControl используя автореферентное DataContext набор на содержащей сетке (это тоже не работает).

однако ни один из этих продуктов не работал.

Некоторые заключительные замечания:

  • Это для 7.5 проекта Windows Phone
  • Edit: Одним из способов связывания лань не работает, либо, кажется, что существует проблема привязки к UserControl-х собственные свойства
+0

Является ли ваш конвертер 'BoolToNotBool' TwoWay? –

+0

Это так. Я работал над этим немного больше, и я обнаружил, что он работает, если я связываюсь непосредственно с UserControl XAML, а не привязываюсь через. свойства UserControl, например. 'IsChecked =" {Binding IsBlacklisted, Converter = {StaticResource BoolToNotBool}, Mode = TwoWay} ", однако это не очень общее, поскольку для этого требуется знание имени внешнего ViewModel в' UserControl' ... Я также узнал, что Связывание OneWay не работает нормально, свойства обновлялись только потому, что я устанавливал их в обработчике событий DependencyPropertyChanged - вопрос обновлялся ... – Brendan

ответ

1

An ElementName Binding матчи против x:Name значений, которые находятся в том же объеме, как имя элемента, на котором связывание создается. Недостаточно показанного кода, но вы используете «UserControl», который, как я предполагаю, не задан как имя элемента, но используется для проверки типа. ElementName также может не удастся разрешить, если в шаблоне объявлен CheckBox.

+0

Вы получили его, я установил 'x: Name =" thisUserControl "' в открытии 'UserControl' и ссылается на него в Binding как 'ElementName = thisUserControl', и он работает. Благодаря! – Brendan

Смежные вопросы