Зависимость Свойство, присвоенное привязкой значения, не работает
У меня есть usercontrol с свойством зависимости.
public sealed partial class PenMenu : UserControl, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public bool ExpandCollapse
{
get
{
return false;
}
set
{
//code
}
}
public static readonly DependencyProperty ExpandCollapseProperty = DependencyProperty.Register("ExpandCollapse", typeof(bool), typeof(PenMenu), null);
//some more code
}
И присваиваю значение на странице XAML следующим образом:
<Controls:PenMenu x:Name="penMenu" Opened="Menu_Opened"
ExpandCollapse="{Binding PenMenuVisible}" />
Но это не касается GET-SET части свойства ExpandCollapse в usercontrol.
Поэтому я добавил bool для конвертера bool, чтобы проверить, какое значение передается с привязкой, например:
<Controls:PenMenu x:Name="penMenu" Opened="Menu_Opened"
ExpandCollapse="{Binding PenMenuVisible, Converter={StaticResource booleanToBooleanConverter}}" />
И с точкой останова в конвертере, я вижу, что переданное значение верное.
Какова возможная причина, которую он не присвоил свойству Dependency?
Также на странице XAML, если я говорю:
<Controls:PenMenu x:Name="penMenu" Opened="Menu_Opened"
ExpandCollapse="true"/>
то он попадает в элемент GET-SET свойства ExpandCollapse в usercontrol.
Я застрял. Это странно. Пожалуйста помоги.
Ответы
Ответ 1
Это расстраивает, не так ли? Во-первых, включите обработчик измененного события. Вот так:
public string Title
{
get { return (string)GetValue(TitleProperty); }
set { SetValue(TitleProperty, value); }
}
public static readonly DependencyProperty TitleProperty =
DependencyProperty.Register("Title", typeof(string),
typeof(MyControl), new PropertyMetadata(string.Empty, Changed));
private static void Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var c = d as MyControl;
// now, do something
}
Затем прочитайте эту статью, чтобы увидеть, что есть больше ошибок, чем только один: http://blog.jerrynixon.com/2013/07/solved-two-way-binding-inside-user.html
Удачи!
Ответ 2
Не гарантированно запускается приемник и установщик свойства зависимостей, и, в частности, обработчик привязки WPF/XAML документирован, чтобы обойти их. Посмотрите MSDN - геттер/сеттер должен быть просто оберткой вокруг GetValue
/SetValue
на DependencyProperty
сам по себе.
Вместо того, чтобы реагировать в настройщике вашего свойства, вы должны добавить свойство измененного обработчика в исходный вызов DependencyProperty.Register
, когда вы можете действовать с новым значением.
(см. прочее questions).