2015-07-13 2 views
1

У меня есть простой пользовательский элемент управления, который имеет одну Dependency Property (контроль является модель сама по себе)Bind значение окна модель управления пользователя Dependency собственности

Свойство непосредственно не связан ни к чему внутри пользовательского элемента управления, но Мне нужно привязать его значение к Модели окна (или пользовательскому элементу управления или тому подобное), где я устанавливаю свой пользовательский элемент управления.

Если я установил вручную значение свойства управления пользователя, свойство было правильно изменено, поэтому я могу предположить, что свойство зависимостей в пользовательском элементе управления работает.

Если я устанавливаю значение свойства привязки его к моей модели окна, как этого

<lctrl:InfoIconControl Grid.Row="0" Name="InfoIconTest" IconType="{Binding Path=IconTypeValue}"/> 

Где IconTypeValue является свойством модели окна, когда я установил значение окна свойств модели она не изменение внутри моего пользовательского элемента управления. Я предполагаю, что я сделал что-то не так, но на данный момент я понятия не имею.

+0

ли IconTypeValue поднять PorpertyChanged событие? Показать объявление IconType. – Maximus

+0

Что означает свойство 'IconTypevalue' и класс? И что такое 'DataContext' вашего' InfoIconControl'? – Rachel

ответ

1

Два можности приходят на ум, как, скорее всего:

  1. Ваш «модель» (вы имеете в виду ViewModel?) Не реализует INotifyPropertyChanged и/или вы не обжиг PropertyChanged когда IconTypeValue изменяет свое значение.
  2. Вы сделали что-то вроде внутри вашего UserControl, и теперь привязка не работает, потому что ищет свойство IconTypeValue внутри вашего элемента управления, а не ищет его в «модели».

Решение для варианта 1 прост: реализовать интерфейс и убедиться, что вы запускаете событие, когда изменяется свойство.

Решение для варианта 2 просто удаляет любые настройки DataContext внутри вашего UserControl и вместо этого полагается на относительные привязки (RelativeSource, ElementName и т. Д.) В XAML вашего элемента управления. Или, если вам нужно установить DataContext, НЕ устанавливайте его в UserControl. Вместо этого установите DataContext контейнера INSIDE для UserControl.

В вашем случае, поскольку вы используете viewmodel для своего UserControl, используя его как DataContext, имеет смысл. Но если вы хотите поддерживать привязку к DependencyProperties вашего UserControl, вам нужно настроить свою модель просмотра как DataContext чего-то еще ... Например, первая Grid в вашем XAML.

Просто имя сетки:

<Grid x:Name="LayoutRoot"> 

И установить ViewModel в качестве DataContext:

InfoIconControlModel mModel; 
public InfoIconControl() 
{ 
    InitializeComponent(); 
    mModel = new InfoIconControlModel(); 
    LayoutRoot.DataContext = mModel; // this.DataContext = mModel; <-- DON'T DO THIS 
} 

После этого Наручники начнет работать. Но вы допустили еще одну типичную ошибку: вы вызываете только SetIcon с помощью средства настройки CLR вашего свойства.

public InfoIconType IconType 
{ 
    get 
    { 
     return (InfoIconType)this.GetValue(IconTypeProperty); 
    } 
    set 
    { 
     this.SetValue(IconTypeProperty, value); 
     this.SetIcon(); // <-- This won't work with Binding 
    } 
} 

Вместо этого, вы должны также вызвать из обратного вызова DependencyPropertyChanged (что вы уже определены, с другой стороны):

/// <summary> 
/// Icon Type dependency Property 
/// </summary> 
public static readonly DependencyProperty IconTypeProperty = DependencyProperty.Register(
    FLD_IconType, typeof(InfoIconType), typeof(InfoIconControl), new PropertyMetadata(InfoIconType.ICPlus, IconTypePropertyChanged)); 


///<summary> 
/// 
///</summary> 
private static void IconTypePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
{ 
    InfoIconControl ic = sender as InfoIconControl; 
    ic.SetIcon(); // <-- This will work with Binding 
} 
+0

OK Я подозревал, что я использовал вариант 2, но просто чтобы лучше понять: если у меня есть элемент управления, очень маленький и специфичный с 3 свойствами в привязке, как правило, я сам создал модель управления. Теперь, какова правильная практика для привязки данных, чтобы убедиться, что свойства элемента управления связаны с его свойствами, работают правильно, а также свойства управления, открытые для использования внутри окон или элементов управления, которые будут использовать элемент управления, правильно видны и используются? –

+0

Единственный самый важный совет при создании UserControls - не устанавливать его DataContext для себя. Это предотвращает правильное связывание других элементов управления с вашими Ресурсами DependencyProperties UserControl. Вместо этого либо установите DataContext другого контейнера INSIDE в UserControl (чтобы он не влиял на сам UserControl и его DependencyProperties), либо вообще не устанавливал DataContexts и использовал относительные привязки (мой личный фаворит). – almulo

+0

ОК, я протестировал то, что вы предлагаете, но если я не установлю datacontext для моего элемента управления User, даже если я использую ElementName, чтобы указать привязку, где находятся свойства, свойства элемента управления, привязанного к элементу управления атрибуты элементов не работают. Мне нужно уметь привязывать свойства элемента управления к его элементам, и мне нужно иметь возможность привязывать значение некоторых из этих свойств к элементам объекта с помощью моего пользовательского элемента управления, я думал, что он работает как «каскад», автоматически, но похоже, что это не так. –