C# 自定义依赖属性未按预期工作

C# 自定义依赖属性未按预期工作,c#,wpf,dependency-properties,C#,Wpf,Dependency Properties,我已经创建了一个自定义用户控件。它基本上是一个允许多重选择的组合框(每个组合框项目都是一个复选框)。除了Selected items属性外,其他一切都正常工作 public static readonly DependencyProperty SelectedItemsProperty = DependencyProperty.Register("SelectedItems", typeof(ObservableCollection<string>), typeof(Mul

我已经创建了一个自定义用户控件。它基本上是一个允许多重选择的组合框(每个组合框项目都是一个复选框)。除了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();
}
public静态只读从属属性SelectedItemsProperty=
DependencyProperty.Register(“SelectedItems”、typeof(ObservableCollection)、typeof(MultiSelectionComboBox)、new FrameworkPropertyMetadata(null、,
新属性ChangedCallback(MultiSelectionComboBox.OnSelectedItemsChanged));
公共可观测集合SelectedItems
{
get{return(ObservableCollection)GetValue(SelectedItemsProperty);}
设置
{
设置值(SelectedItemsProperty,value);
}
}
SelectedItemsChanged上的私有静态无效(DependencyObject d、DependencyPropertyChangedEventArgs e)
{
MultiSelectionComboBox控件=(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>();
公共可观察收集IpAddressSelection
{
获取{返回ipAddressSelection;}
设置
{
设置字段(参考ipAddressSelection,值,“ipAddressSelection”);
}
}
私有ObservableCollection ipAddressSelection=新ObservableCollection();

SetField是实现INotifyPropertyChanged接口的函数。我的问题是,当我选择一个项目时,IpAddressSelection看不到任何更改(即,我无法进入IpAddressSelection的“集合”)。你知道我做错了什么吗?

发现了我的错误。我需要在绑定中设置双向模式

<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..." />

与例如属性一样,SelectedItems属性在默认情况下应双向绑定

在注册期间默认设置
FrameworkPropertyMetadataOptions.bindstwoway

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接口,并附加/分离处理程序方法。请参见,例如…

选择项目时,为什么会调用IpAddressSelection属性的setter?仅当您将IpAddressSelection属性设置或绑定到ObservableCollection时,才会调用该属性…仅在阅读您的注释时,我发现了我的错误。我需要在绑定中设置Mode=TwoWay。我需要IpAddressSelection来存储SelectedItemsSo它现在可以正常工作了吗?是的。我会留下一个答案,而不是删除这个问题。也许它对某些人有用有什么原因导致属性类型为
ObservableCollection
?您似乎没有注册任何CollectionChanged,即使在任何地方。除了
字符串
,您还无法使用任何其他项目类型。默认情况下,SelectedItems属性应该双向绑定,例如ListBox.SelectedItem。在注册时设置。@Clemens嗯,这是我不知道的。如果您在回复中写下如何定义属性,我会将您的属性标记为已接受。请注意,
UpdateSourceTrigger=PropertyChanged
是默认设置。您不需要显式地设置它。