Два можности приходят на ум, как, скорее всего:
- Ваш «модель» (вы имеете в виду ViewModel?) Не реализует
INotifyPropertyChanged
и/или вы не обжиг PropertyChanged
когда IconTypeValue
изменяет свое значение.
- Вы сделали что-то вроде внутри вашего 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
}
ли IconTypeValue поднять PorpertyChanged событие? Показать объявление IconType. – Maximus
Что означает свойство 'IconTypevalue' и класс? И что такое 'DataContext' вашего' InfoIconControl'? – Rachel