C# 多个列表框SelectedItem绑定到同一属性
我有两个列表框,它们都包含相同类型的项,并且它们的SelectedItem属性都绑定到我的ViewModel上的相同属性。我希望,当我在列表A中选择某个项目时,列表B中的选择会消失。但事实并非如此。我需要一个难看的解决办法,让它按照我的预期工作。有没有什么提示可以让它在没有这个解决方法的情况下工作 XAMLC# 多个列表框SelectedItem绑定到同一属性,c#,wpf,C#,Wpf,我有两个列表框,它们都包含相同类型的项,并且它们的SelectedItem属性都绑定到我的ViewModel上的相同属性。我希望,当我在列表A中选择某个项目时,列表B中的选择会消失。但事实并非如此。我需要一个难看的解决办法,让它按照我的预期工作。有没有什么提示可以让它在没有这个解决方法的情况下工作 XAML C# 公共部分类主窗口:INotifyPropertyChanged { 私人物品_selectedItem; 公共可观测集合项1{get;private set;} 公共可观测集合项2
C#
公共部分类主窗口:INotifyPropertyChanged
{
私人物品_selectedItem;
公共可观测集合项1{get;private set;}
公共可观测集合项2{get;private set;}
公共项目选择项
{
获取{return\u selectedItem;}
设置
{
//取消对此的注释以使其工作
//_selectedItem=null;
//OnPropertyChanged();
_选择editem=值;
OnPropertyChanged();
}
}
公共主窗口()
{
Items1=新的ObservableCollection();
Items2=新的ObservableCollection();
项目1.添加(新项目(“A1”);
项目1.添加(新项目(“A2”);
项目2.增加(新项目(“B1”);
项目2.增加(新项目(“B2”);
初始化组件();
}
private void按钮base_OnClick(对象发送方,RoutedEventTarget e)
{
SelectedItem=null;
}
公共事件属性更改事件处理程序属性更改;
受保护的虚拟void OnPropertyChanged([CallerMemberName]字符串propertyName=null)
{
PropertyChangedEventHandler处理程序=PropertyChanged;
if(handler!=null)handler(这是新的PropertyChangedEventArgs(propertyName));
}
}
公共类项目
{
公共项(字符串名称)
{
名称=名称;
}
字符串名称{get;set;}
}
为什么不将它们(双向
绑定)绑定到两个不同的属性(例如SelectedItem1
和SelectedItem2
),然后:
编辑:然后对于应用程序代码的其余部分,您可以使用SelectedItem
属性,如下所示。另外,不要忘记在SelectedItem1
和SelectedItem2
的setter中添加OnPropertyChanged(“SelectedItem”)
public Item SelectedItem
{
get{return SelectedItem1 != null ? SelectedItem1 : SelectedItem2}
}
如果这是一个难看的解决方案,请点击SelectionChanged事件:
<ListBox x:Name="ListBoxA" ItemsSource="{Binding Items1}" SelectedItem="{Binding SelectedItem}" SelectionChanged="ListBox_SelectionChanged"></ListBox>
<ListBox x:Name="ListBoxB" Grid.Column="1" ItemsSource="{Binding Items2}" SelectedItem="{Binding SelectedItem}" SelectionChanged="ListBox_SelectionChanged" ></ListBox>
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (sender == this.ListBoxA)
this.ListBoxB.UnselectAll();
else
this.ListBoxA.UnselectAll();
}
私有无效列表框\u SelectionChanged(对象发送方,SelectionChangedEventArgs e)
{
if(sender==this.ListBoxA)
this.ListBoxB.UnselectAll();
其他的
this.ListBoxA.UnselectAll();
}
更好的是,使用附加的行为来做同样的事情。因为对于应用程序逻辑的其余部分,这是不相关的,代码将更简单,只有一个绑定属性。谢谢。仍然是3个属性对1个属性。我还想知道为什么WPF会这样做。
public Item SelectedItem1
{
get { return _selectedItem1; }
set
{
_selectedItem1 = value;
OnPropertyChanged();
if(value!=null) //Here is the trick.
SelectedItem2=null;
OnPropertyChanged("SelectedItem");
}
}
public Item SelectedItem
{
get{return SelectedItem1 != null ? SelectedItem1 : SelectedItem2}
}
<ListBox x:Name="ListBoxA" ItemsSource="{Binding Items1}" SelectedItem="{Binding SelectedItem}" SelectionChanged="ListBox_SelectionChanged"></ListBox>
<ListBox x:Name="ListBoxB" Grid.Column="1" ItemsSource="{Binding Items2}" SelectedItem="{Binding SelectedItem}" SelectionChanged="ListBox_SelectionChanged" ></ListBox>
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (sender == this.ListBoxA)
this.ListBoxB.UnselectAll();
else
this.ListBoxA.UnselectAll();
}