WPF DependencyProperty и привязка данных - PullRequest
1 голос
/ 22 августа 2010

Я работаю над проектом WPF. Я создаю usercontrol, содержащий выпадающий список; которые представляют логическое значение (True или false). И я регистрирую DependencyProperty Value для моего usercontrol.

Всякий раз, когда выбор в выпадающем списке был изменен, я буду обновлять свойство Value, а также при обновлении свойства Value я буду обновлять выпадающий список.

Но я обнаружил проблему, когда использую свой usercontrol в MVVM. Я связываю свойство Value со своим свойством IsEnable в моей модели представления. Я установил режим привязки как TwoWay привязка. Но когда я изменил выделение в comboBox, свойство IsEnable никогда не устанавливается.

Мой пользовательский контроль:

public bool Value
{
    get { return (bool)GetValue(ValueProperty); }
    set { SetValue(ValueProperty, value); }
}

public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register("Value", typeof(bool), 
        typeof(BooleanComboBox),
        new UIPropertyMetadata(true, OnValuePropertyChanged));

private void Cmb_Selection_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ComboBox cmb = sender as ComboBox;
    object selectedValue = cmb.SelectedValue;
    if (selectedValue == null)
    {
        this.Value = false;
    }
    else
    {
        if (selectedValue.GetType() == typeof(bool))
        {
            this.Value = (bool)selectedValue;
        }
        else
        {
            this.Value = false;
        }
    }

    if (this.OnValueChange != null)
        this.OnValueChange(this, this.Value);
}

private static void OnValuePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
{
    BooleanComboBox self = sender as BooleanComboBox;
    self.Cmb_Selection.SelectedValue = (bool)args.NewValue;
}

В окне, где я размещаю свой usercontrol (я уже установил для контекста данных usercontrol мой viewModel):

<tibsExtControl:BooleanComboBox Grid.Row="4" 
                                Grid.Column="1" 
                                VerticalAlignment="Center"
                                Value="{Binding Path=NewTemporaryZone.IsEnable, 
                                                Mode=TwoWay, 
                                                UpdateSourceTrigger=PropertyChanged}"
                                x:Name="Cmb_AllowNonLBILogon"/>

В моем классе моделей я объявляю свойство IsEnable:

private bool _isEnable;
public bool IsEnable
{
    get { return _isEnable; }
    set 
    { 
        _isEnable= value;
        OnPropertyChanged("IsEnable");
    }
}

Что происходит с моим контролем пользователя. Я что то пропустил? Пожалуйста, помогите мне. T.T

Ответы [ 3 ]

0 голосов
/ 23 августа 2010

Попробуйте обновить привязку в Cmb_Selection_SelectionChanged.Что-то вроде:

BindingExpression b = cmb.GetBindingExpression(MyNamespace.ValueProperty);
b.UpdateSource();
0 голосов
/ 12 августа 2011

У меня была такая же проблема;с булевыми свойствами зависимости!Попробуйте переключить bool на INullable<bool> (bool?) и применить соответствующие преобразования типов.Это сработало для меня.Не знаете, является ли это ошибкой или типы значений обрабатываются несколько иначе, чем ссылочные типы при создании свойств зависимостей?Может быть, кто-то еще сможет это проверить.

0 голосов
/ 23 августа 2010

Пожалуйста, проверьте, есть ли у вас ошибка привязки в окне вывода VS.

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