2010-05-17 2 views
0

У меня есть два UserControls («UserControlParentView» и «UserControlChildView») с шаблоном MVVM, реализованным в обоих элементах управления. Родительский контроль - это контейнер для Child control, а свойство child control должно быть обновлено привязкой данных из Parent control, чтобы показать/скрыть некоторую флажку внутри Child control.Данные привязки Silverlight к свойствам родительского пользовательского элемента управления с использованием MVVM в обоих элемента управления

Родительский контроль Описание

UserControlParentViewModel обладает свойством:

private bool isShowCheckbox = false; 
    public bool IsShowCheckbox 
    { 
     get { return isShowCheckbox; } 
     set { isShowCheckbox = value; NotifyPropertyChanged("IsShowCheckbox"); } 
    } 

UserControlParentViewModel - как я установил DataContext управления Родитель:

public UserControlParentView() 
    { 
     InitializeComponent(); 

     this.DataContext = new UserControlParentViewModel(); 
    }   

UserControlParentView содержит кнопку переключения (в XAML), связанный с свойством UserControlParentViewModel IsShowCheckbox

<ToggleButton Grid.Column="1" IsChecked="{Binding IsShowCheckbox, Mode=TwoWay}"></ToggleButton> 

Также родительский контроль содержит экземпляр дочернего элемента (где-то в XAML)

<local:UserControlChildView IsCheckBoxVisible="{Binding IsShowCheckbox}" ></local:UserControlChildView> 

так собственности в дочернем элементе управления должны обновляться при нажатии кнопки пользователь togggle/untoggle. Детский контроль содержит Boolean свойство, которое должно быть обновлено от родительского элемента управления, но ничего не произошло! Точка прерывания никогда не срабатывала!

Недвижимость в UserControlChildView, которые должны быть обновлены из-под контроля родителей (здесь я планирую сделать chechBox видимым/скрытый в код):

public bool IsCheckBoxVisible 
    { 
     get { return (bool)GetValue(IsCheckBoxVisibleProperty); } 
     set { SetValue(IsCheckBoxVisibleProperty, value); } 
    } 
    // Using a DependencyProperty as the backing store for IsCheckBoxVisible. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty IsCheckBoxVisibleProperty = 
     DependencyProperty.Register("IsCheckBoxVisible", typeof(bool), typeof(TopMenuButton), new PropertyMetadata(false)); 

Так что вопрос - что я делаю не так? Почему детская собственность никогда не обновляется? BTW - нет каких-либо обязательных предупреждений об ошибках в окне вывода ...

+0

ли UserControlChildView иметь DataContext? –

+0

Да .... Pardon - UserControl сам - еще нет - в конструкторе Child control: this.LayoutRoot.DataContext = this; Это связано с тем, что некоторые внутренние элементы управления пользователями должны связываться с некоторыми свойствами в пользовательском управлении. Например. пользовательский элемент Child также имеет такое свойство: public string ButtonText { get {return localDataContext.ButtonText; } set {localDataContext.ButtonText = значение; NotifyPropertyChanged ("ButtonText"); }} и используется во внутренней кнопки (в элементе управления Child), например: MagicMax

+0

извините за не отформатированный текст - не может понять, как исправить это :( – MagicMax

ответ

0

Я не могу увидеть весь код, так что я не могу работать все, но несколько вопросов:

В вашем DependencyProperty .Register call, вы указываете typeof (TopMenuButton), который должен быть UserControlChildView - я не знаю, является ли это ваше мнение или нет?

Вы не настроили метод обратного вызова для измененного свойства. Для этого вы должны определить свойства для FrameworkPropertyMetadata, перед регистрацией depencencyProperty так:

FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata(); 
metadata.PropertyChangedCallback += OnSpacePropertyChanged; 

Вы бы тогда должны объявить OnSpacePropertyChanged, но вы можете по крайней мере, реагировать на установки свойства там.

+0

Моя ошибка - для простоты я решил переименовать TopMenuButton в Child control, но забыл переименовать его в depend.prop.declaration - извините! – MagicMax

0

Я уверен, что вы не можете привязываться к свойству зависимости в пользовательском элементе управления Silverlight 3. Я пробовал это сам 9 месяцев назад и пытался использовать всевозможные вещи, чтобы заставить его работать. В конце концов я где-то читал, что это просто невозможно. Я сделал это в WPF, так что некоторое время бил головой об этом, думая, что это моя реализация.

Итак, на поверхности ваш код выглядит правильно, но это не поможет.

Я думал, что это было намечено как что-то, что нужно зафиксировать в SL4.

Вы используете SL4?

+0

Да, я использую SL4 .. – MagicMax

0

Hoho !! Мне нужно работать!

В контроле ребенка я изменил свойство чуток

public bool IsCheckBoxVisible 
    { 
     get { return (bool)GetValue(IsCheckBoxVisibleProperty); } 
     set { SetValue(IsCheckBoxVisibleProperty, value); } 
    } 
    // Using a DependencyProperty as the backing store for IsCheckBoxVisible. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty IsCheckBoxVisibleProperty = 
     DependencyProperty.Register("IsCheckBoxVisible", typeof(bool), typeof(UserControlChildView), new PropertyMetadata(false, new PropertyChangedCallback((d, dc) => 
     { 
      var button = d as UserControlChildView; 
      button.CheckBoxVisibility = ((bool)dc.NewValue) ? Visibility.Visible : Visibility.Collapsed; 
     }))); 

так что теперь у меня есть новая подписка на события (см анонимный метод) и срабатывает, когда в родительский элемент управления IsShowCheckbox свойство изменяется!

CheckBoxVisibility depend.property выглядит следующим образом:

public Visibility CheckBoxVisibility 
    { 
     get { return (Visibility)GetValue(CheckBoxVisibilityProperty); } 
     set { SetValue(CheckBoxVisibilityProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for IsCheckBoxVisible. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty CheckBoxVisibilityProperty = 
     DependencyProperty.Register("CheckBoxVisibility", typeof(Visibility), typeof(UserControlChildView), new PropertyMetadata(Visibility.Collapsed)); 

Конструктор serControlChildView выглядит следующим образом:

public UserControlChildView() 
    { 
     InitializeComponent(); 

     this.LayoutRoot.DataContext = this; 
    } 

Так кажется, что это работает! Спасибо вам за помощь, ребята!

2

Вы не указали, где вы поставили точку останова «никогда не стреляли!». Я предполагаю, что вы размещаете точку останова в методе мутатора set свойства IsCheckBoxVisible.

Вы работаете в предположении, что привязка к этому свойству в какой-то момент приведет к вызову метода set при назначении значения. Тем не менее, Silverlight binding framework делает вызовы SetValue напрямую. Он передает методу SetValue значение IsCheckBoxVisibleProperty и значение, которое должно быть назначено.

+0

Вы правы! Спасибо за информацию! – MagicMax

0

Хорошо, кажется, все работает нормально, и я был смущен просто неработающей точкой останова.

Для простоты я решил удалить IsCheckBoxVisible boolean depend.property из дочернего элемента управления и привязать видимость checkBox в Child Control непосредственно к CheckBoxVisibility depend.property (type is Visibility).

Также в управлении Родитель теперь у меня есть это:

<local:UserControlChildView CheckBoxVisibility="{Binding Path=CheckboxControlVisibility}"></local:UserControlChildView> 

Таким образом, в контроле Родитель теперь у меня есть свойство CheckboxControlVisibility (тип Видимость)

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