C# WPF组合框选择导致在第二个组合框中进行选择
我正在将两个组合框绑定到同一个listviewcollection。问题在于,在一个组合框中选择一个值会导致另一个组合框选定项更改为第一个组合框的精确值。它们是耦合的,我希望它们彼此独立 MyListViewCollection是这样的C# WPF组合框选择导致在第二个组合框中进行选择,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我正在将两个组合框绑定到同一个listviewcollection。问题在于,在一个组合框中选择一个值会导致另一个组合框选定项更改为第一个组合框的精确值。它们是耦合的,我希望它们彼此独立 MyListViewCollection是这样的 modelsView = new ListCollectionView(MainVM.All_Models); public ObservableCollection<MLModel> All_Models { get; set; } = new
modelsView = new ListCollectionView(MainVM.All_Models);
public ObservableCollection<MLModel> All_Models { get; set; } = new ObservableCollection<MLModel>() { };
<ComboBox ItemsSource="{Binding Path=modelsView}" SelectedItem="{Binding SelectedModel_Right}" SelectionChanged="RightSideModelSelection">
<ComboBox ItemsSource="{Binding Path=modelsView}" SelectedItem="{Binding SelectedModel_Left}" SelectionChanged="LeftSideModelSelection">
All_Models
是一个可观察的自定义对象集合,如下所示
modelsView = new ListCollectionView(MainVM.All_Models);
public ObservableCollection<MLModel> All_Models { get; set; } = new ObservableCollection<MLModel>() { };
<ComboBox ItemsSource="{Binding Path=modelsView}" SelectedItem="{Binding SelectedModel_Right}" SelectionChanged="RightSideModelSelection">
<ComboBox ItemsSource="{Binding Path=modelsView}" SelectedItem="{Binding SelectedModel_Left}" SelectionChanged="LeftSideModelSelection">
所以一切正常,组合框包含来自models视图的相同项目列表,这正是我想要的。
我肯定已经将所选项目绑定到视图模型中的两个独立属性,它们是
private MLModel _selectedModel_left;
public MLModel SelectedModel_Left
{
get { return _selectedModel_left; }
set
{
SetProperty(ref _selectedModel_left, value);
}
}
private MLModel _selectedModel_right;
public MLModel SelectedModel_Right
{
get { return _selectedModel_right; }
set
{
SetProperty(ref _selectedModel_right, value);
}
}
我唯一能想到的是,它们都引用了集合中的同一个对象,但我不确定这是如何导致这种行为的。
此外,所需的行为是每个组合框能够从同一集合中选择和显示不同的项
任何解释以及建议的将两个组合框选择相互解耦的方法都会很有帮助
编辑:根据要求,这里是创建最小工作示例的代码
MainWindow.xaml
<Window x:Class="WpfApplication3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication3"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel Orientation="Vertical">
<ComboBox ItemsSource="{Binding Path=modelsView}" SelectedItem="{Binding SelectedModel_Left}" >
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Name}"></TextBlock>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<ComboBox ItemsSource="{Binding Path=modelsView}" SelectedItem="{Binding SelectedModel_Right}" >
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Name}"></TextBlock>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</StackPanel>
</Grid>
</Window>
ViewModel.cs
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace WpfApplication3
{
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public ViewModel()
{
modelsView = new ListCollectionView(All_Models);
//modelsView.Filter = modelsFilter;
}
public ListCollectionView modelsView { get; set; }
public ObservableCollection<MLModel> All_Models { get; set; } = new ObservableCollection<MLModel>() {
new MLModel() { Name = "One", Type = "TypeOne" },
new MLModel() {Name = "Two", Type = "TypeTwo" },
new MLModel() {Name = "Three", Type = "TypeThree" }
};
private MLModel _selectedModel_left;
public MLModel SelectedModel_Left
{
get { return _selectedModel_left; }
set
{
this._selectedModel_left = value;
NotifyPropertyChanged();
}
}
private MLModel _selectedModel_right;
public MLModel SelectedModel_Right
{
get { return _selectedModel_right; }
set
{
this._selectedModel_right = value;
NotifyPropertyChanged();
}
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Collections.ObjectModel;
使用系统组件模型;
使用System.Linq;
使用System.Runtime.CompilerServices;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows.Data;
命名空间WpfApplication3
{
公共类视图模型:INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
私有void NotifyPropertyChanged([CallerMemberName]字符串propertyName=”“)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
公共视图模型()
{
modelsView=新列表集合视图(所有模型);
//modelsView.Filter=modelsFilter;
}
公共ListCollectionView模型视图{get;set;}
公共ObservableCollection所有_模型{get;set;}=new ObservableCollection(){
新的MLModel(){Name=“One”,Type=“TypeOne”},
新的MLModel(){Name=“Two”,Type=“TypeTwo”},
新的MLModel(){Name=“Three”,Type=“TypeThree”}
};
private MLModel _selectedModel _left;
公共MLModel SelectedModel\u左
{
获取{return\u selectedModel\u left;}
设置
{
这是。_selectedModel_left=值;
NotifyPropertyChanged();
}
}
私有MLModel _选择Model _right;
公共MLModel SelectedModel\u Right
{
获取{return\u selectedModel\u right;}
设置
{
这是。\ u selectedModel\u right=value;
NotifyPropertyChanged();
}
}
}
}
来自:
如果目标是ItemsControl,则当前项与选定项同步
您正在两个组合框
对象之间共享相同的ListCollectionView
。这意味着当前选定的项目将在视图中更新,并在使用相同视图的任何其他ItemsControl
中复制
如果不希望出现这种行为,则需要为每个组合框
指定其自己的列表集合视图
对象进行绑定
或者,您可以将每个
组合框的属性设置为false
FWIW,您的问题可能是和@PeterDuniho的重复。很抱歉,我最初的搜索没有找到这些帖子。