我创建了一个自定义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;)。你知道我在这里做错了吗?
答案 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..." />