Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多个列表框SelectedItem绑定到同一属性_C#_Wpf - Fatal编程技术网

C# 多个列表框SelectedItem绑定到同一属性

C# 多个列表框SelectedItem绑定到同一属性,c#,wpf,C#,Wpf,我有两个列表框,它们都包含相同类型的项,并且它们的SelectedItem属性都绑定到我的ViewModel上的相同属性。我希望,当我在列表A中选择某个项目时,列表B中的选择会消失。但事实并非如此。我需要一个难看的解决办法,让它按照我的预期工作。有没有什么提示可以让它在没有这个解决方法的情况下工作 XAML C# 公共部分类主窗口:INotifyPropertyChanged { 私人物品_selectedItem; 公共可观测集合项1{get;private set;} 公共可观测集合项2

我有两个列表框,它们都包含相同类型的项,并且它们的SelectedItem属性都绑定到我的ViewModel上的相同属性。我希望,当我在列表A中选择某个项目时,列表B中的选择会消失。但事实并非如此。我需要一个难看的解决办法,让它按照我的预期工作。有没有什么提示可以让它在没有这个解决方法的情况下工作

XAML


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