Что происходит с SetBinding () в Silverlight - PullRequest
1 голос
/ 03 апреля 2012

У меня есть следующий код, который является частью обходного пути для привязки нулевых значений к ComboBox. (Предположим, я не поддерживаю изменение этой реализации).

    SetBinding(ComboBox.SelectedValueProperty, _cachedBinding);

Вопрос в следующем: ведет ли эта строка кода к исходному обновлению Target и наоборот?

Итак, если у меня есть это свойство в модели представления:

 string MyProperty
 {
     get { return _myProperty; }
     set 
     {
        myProperty = value;
        IsDirty = true;
     }
 }

тогда сеттер будет вызван, когда я позвоню SetBinding. Это будет проблематично, поскольку в установщике я также управляю свойством `IsDirty, чтобы отслеживать изменения. Я могу кодировать:

 string MyProperty
 {
     get { return _myProperty; }
     set 
     {  
        if (myProperty != value)
        {
           myProperty = value;
           IsDirty = true;
        }
     }
 }

но я чувствую, что это будет не элегантно, так как у меня там много свойств.

Итак, мой второй вопрос (при условии, что ответ на первый вопрос - да), могу ли я заставить Silverlight не обновлять цель или источник после SetBinding() (поэтому они будут обновляться только при их изменении)

Как работает этот обходной путь: http://surrealization.com/sample-code/fixing-combobox-selectedvalue-bug-with-expression-behaviors/. _cachedBinding, таким образом, содержит привязку, которая была установлена ​​до того, как MyProperty стала null, и привязка исчезла (так что это та же самая привязка, которая была там (не такая, как хотя объект, так как он был создан заново)).

Еще раз посмотрим на код, это может быть даже один и тот же объект, но это зависит от того, как GetBindingExpression и ParentBinding работают в .NET.

Вот полностью подкласс Combobox:

public class ComboBoxFixedBinding : ComboBox
{
    #region Events

    private void ComboBoxEx_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

        if (SelectedValue == null)
        {
            if (_cachedBinding != null && GetExistingBinding() == null)
            {
                SetBinding(ComboBox.SelectedValueProperty, _cachedBinding);
            }
        }
        else
        {
            CacheExistingBinding();
        }
    }

    private void CacheExistingBinding()
    {
        Binding binding = GetExistingBinding();

        if (binding != null)
        {
            _cachedBinding = binding;
        }
    }

    private Binding GetExistingBinding()
    {
        BindingExpression bindingExpr = this.GetBindingExpression(ComboBox.SelectedValueProperty);
        if (bindingExpr == null)
        {
            return null;
        }
        else
        {
            return bindingExpr.ParentBinding;
        }

    }

    #endregion

    public ComboBoxFixedBinding()
    {
        SelectionChanged += ComboBoxEx_SelectionChanged;
    }

    private Binding _cachedBinding;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...