[WPF] Не обновляется свойство, к которому биндится DP
От: Аноним  
Дата: 18.04.11 07:06
Оценка:
Добрый день.

Есть собственный контрол, у которго есть 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?
Re: [WPF] Не обновляется свойство, к которому биндится DP
От: MxMsk Португалия  
Дата: 18.04.11 07:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>И вот когда я выставляю obj.MyDP == MyEnum.Select в MyDP_Changed, то на форме ListBox.SelectedValue не меняется.

А>Как мне из моего контрола обновить всех Target DP?
Подозреваю, это связано с тем, что присваивание (там ведь одно "равно", да) происходит в обработчике изменения, который инициируется при выборе в ListBox.
Re[2]: [WPF] Не обновляется свойство, к которому биндится DP
От: Аноним  
Дата: 18.04.11 07:37
Оценка:
Здравствуйте, MxMsk, Вы писали:
MM>Подозреваю, это связано с тем, что присваивание (там ведь одно "равно", да) происходит в обработчике изменения, который инициируется при выборе в ListBox.

Ага, одно = )).
Да т.к. в обработчике, в других местах меняет норм. А можно это как-то пофиксить?
Re[3]: [WPF] Не обновляется свойство, к которому биндится DP
От: MxMsk Португалия  
Дата: 18.04.11 07:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Да т.к. в обработчике, в других местах меняет норм. А можно это как-то пофиксить?

Видимо WPF таким образом примитивно защищается от зацикливания. Изменился выбор в ListBox, позвали обработчик, тот изменил MyDP, из-за чего снова изменился выбор в ListBox, снова позвали обработчик... Попробуй менять значение свойства через Dispatcher.BeginInvoke. Как-то так:
if (тут условие)
    if (obj.MyDP == MyEnum.Create)
    {
        obj.Dispatcher.BeginInvoke((Action)(() =>  obj.MyDP = MyEnum.Select));
    }

Только надо иметь ввиду, что до вызова переданного в Dispatcher действия, свойство некоторое время все-таки будет иметь значение Create.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.