自定义DependecyProperty无法按预期工作

时间:2017-11-03 14:37:13

标签: c# wpf dependency-properties

我创建了一个自定义UserControl。它基本上是一个允许多重选择的组合框(每个组合框项目都是一个复选框)。除了Selected items属性

之外,一切正常
public static readonly DependencyProperty SelectedItemsProperty =
     DependencyProperty.Register("SelectedItems", typeof(ObservableCollection<string>), typeof(MultiSelectionComboBox), new FrameworkPropertyMetadata(null,
new PropertyChangedCallback(MultiSelectionComboBox.OnSelectedItemsChanged)));


public ObservableCollection<string> SelectedItems
{
    get { return (ObservableCollection<string>)GetValue(SelectedItemsProperty); }
    set
        {
            SetValue(SelectedItemsProperty, value);
        }
}


private static void OnSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    MultiSelectionComboBox control = (MultiSelectionComboBox)d;
    control.SetText();
}

在这一方面,事情似乎有效,这意味着当我选择一个新项目时,SelectedItems会发生变化并触发回调。当我使用这个自定义用户控件时,问题就出现了。

这是我定义它的方式:

<views:MultiSelectionComboBox SelectedItems="{Binding Path=IpAddressSelection, UpdateSourceTrigger=PropertyChanged}" Background="White" BorderThickness="1" ItemsSource="{Binding Path=Address}" BorderBrush="LightGray" Grid.Row="0" Grid.Column="1" Width="200" Margin="70 10 0 0" DefaultText="Indirizzo IP..." />

这是SelectedItems属性的绑定:

public ObservableCollection<string> IpAddressSelection
{
    get { return ipAddressSelection; }
    set
    {
        SetField(ref ipAddressSelection, value, "IpAddressSelection");
    }
}

private ObservableCollection<string> ipAddressSelection = new ObservableCollection<string>();

SetField是一个实现INotifyPropertyChanged接口的函数。我的问题是,当我选择一个项目时,IpAddressSelection看不到任何变化(即我无​​法进入IpAddressSelection的&#34; set&#34;)。你知道我在这里做错了吗?

2 个答案:

答案 0 :(得分:2)

就像例如Selector.SelectedItem属性,您的SelectedItems属性默认情况下应该双向绑定。

在注册期间设置FrameworkPropertyMetadataOptions.BindsTwoWayByDefault

public static readonly DependencyProperty SelectedItemsProperty =
    DependencyProperty.Register(
        nameof(SelectedItems),
        typeof(IEnumerable),
        typeof(MultiSelectionComboBox),
        new FrameworkPropertyMetadata(
            null,
            FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
            OnSelectedItemsChanged));

public IEnumerable SelectedItems
{
    get { return (IEnumerable)GetValue(SelectedItemsProperty); }
    set { SetValue(SelectedItemsProperty, value); }
}

如果您需要对SelectedItems集合的更改做出反应,您可以检查它是否实现了INotifyCollectionChanged接口,并附加/分离处理程序方法。参见例如this answer

答案 1 :(得分:0)

发现我的错误。我需要在绑定

中设置TwoWay模式
<views:MultiSelectionComboBox SelectedItems="{Binding Path=IpAddressSelection, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Background="White" BorderThickness="1" ItemsSource="{Binding Path=Address}" BorderBrush="LightGray" Grid.Row="0" Grid.Column="1" Width="200" Margin="70 10 0 0" DefaultText="Indirizzo IP..." />