Добрый день.
Есть собственный контрол, у которго есть DependencyProperty и это DependencyProperty биндится на ListBox основного окна.
Соответсвенно контрол на форме.
public MyEnum MyDP
{
get { return (MyEnum)GetValue(MyDPProperty); }
set { SetValue(MyDPProperty, value); }
}
public static readonly DependencyProperty MyDPProperty =
DependencyProperty.Register("MyDP", typeof(MyEnum), typeof(PartModelFrame), new UIPropertyMetadata(MyEnum.Select, MyDP_Changed));
private static void MyDP_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var obj = d as PartModelFrame;
if (obj == null) return;
if(тут условие)
if (obj.MyDP == MyEnum.Create)
{
obj.MyDP == MyEnum.Select;
return;
}
}
<ListBox SelectedValuePath="Tag">
<ListBox.SelectedValue>
<Binding Path="MyDP" ElementName="MyControl" Mode="TwoWay"/>
</ListBox.SelectedValue>
<Image Tag="Select"/>
<Image Tag="Create"/>
</ListBox>
И вот когда я выставляю obj.MyDP == MyEnum.Select в MyDP_Changed, то на форме ListBox.SelectedValue не меняется.
Как мне из моего контрола обновить всех Target DP?
Здравствуйте, Аноним, Вы писали:
А>Да т.к. в обработчике, в других местах меняет норм. А можно это как-то пофиксить?
Видимо WPF таким образом примитивно защищается от зацикливания. Изменился выбор в ListBox, позвали обработчик, тот изменил MyDP, из-за чего снова изменился выбор в ListBox, снова позвали обработчик... Попробуй менять значение свойства через Dispatcher.BeginInvoke. Как-то так:
if (тут условие)
if (obj.MyDP == MyEnum.Create)
{
obj.Dispatcher.BeginInvoke((Action)(() => obj.MyDP = MyEnum.Select));
}
Только надо иметь ввиду, что до вызова переданного в Dispatcher действия, свойство некоторое время все-таки будет иметь значение Create.