简体   繁体   中英

WPF DependencyProperty and data binding

I am working on WPF project. I create a usercontrol containing a combobox; which represent boolean value(True or false). And I register a DependencyProperty Value for my usercontrol.

Whenever combobox selection was changed, I will update the Value property and also when Value property is update I will update combobox.

But I found the problem when I use my usercontrol in MVVM. I bind the Value property with my IsEnable property in my viewModel. I set binding mode as TwoWay binding. But when I changed selection in comboBox, IsEnable property is never set.

My usercontrol:

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;
}

In window, where I place my usercontrol (I already set usercontrol's datacontext to my viewModel):

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

In my model class I declare an IsEnable property:

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

What's going on with my usercontrol. I miss something ? Please help me. TT

请检查VS的输出窗口中是否存在任何绑定错误。

Try refreshing your binding in Cmb_Selection_SelectionChanged . Something like:

BindingExpression b = cmb.GetBindingExpression(MyNamespace.ValueProperty);
b.UpdateSource();

I've had the same problem; with boolean dependency properties! Try switching the bool to a INullable<bool> ( bool? ) and apply the appropriate type conversions. This worked for me. Don't know if this is a bug or if value types are handled somewhat different compared to reference types when creating dependency properties? Maybe someone else could verify that.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM