C# 为什么ComboBox.ItemsSource引用ListCollectionView会更改ComboBox.SelectedItem的行为?
假设我有3个组合框控件。每个C# 为什么ComboBox.ItemsSource引用ListCollectionView会更改ComboBox.SelectedItem的行为?,c#,wpf,xaml,combobox,listcollectionview,C#,Wpf,Xaml,Combobox,Listcollectionview,假设我有3个组合框控件。每个ItemsSource引用相同的产品主列表。每个SelectedItem引用另一个选定产品列表的单独数组索引。这一切都很好,程序按预期运行 现在假设我想过滤产品的主列表(例如,仅包含特定字符串“berry”的产品)。将ItemsSource从Products更改为ProductsView会导致两件事: 组合框确实经过了适当的过滤 每当进行选择时,所有组合框都设置为最后一个选择 这是密码。尝试在ItemsSource=“{Binding Path=ProductsVie
ItemsSource
引用相同的产品主列表。每个SelectedItem
引用另一个选定产品列表的单独数组索引。这一切都很好,程序按预期运行
现在假设我想过滤产品的主列表(例如,仅包含特定字符串“berry”的产品)。将ItemsSource从Products更改为ProductsView会导致两件事:
ItemsSource=“{Binding Path=ProductsView}”和ItemsSource=“{Binding Path=Products}”之间切换
MainWindow.xaml:
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<ComboBox ItemsSource="{Binding Path=ProductsView}" SelectedItem="{Binding Path=SelectedProducts[0]}" />
<ComboBox ItemsSource="{Binding Path=ProductsView}" SelectedItem="{Binding Path=SelectedProducts[1]}" />
<ComboBox ItemsSource="{Binding Path=ProductsView}" SelectedItem="{Binding Path=SelectedProducts[2]}" />
</StackPanel>
</Window>
MainWindow.xaml.cs:
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Data;
namespace WpfApplication2
{
public partial class MainWindow : Window
{
public List<Product> Products { get; set; }
public ListCollectionView ProductsView { get; set; }
public ObservableCollection<Product> SelectedProducts { get; set; }
public MainWindow()
{
Products = new List<Product>();
Products.Add(new Product { Name = "Apple" });
Products.Add(new Product { Name = "Orange" });
Products.Add(new Product { Name = "Banana" });
Products.Add(new Product { Name = "Pear" });
Products.Add(new Product { Name = "Strawberry" });
Products.Add(new Product { Name = "Raspberry" });
ProductsView = new ListCollectionView(Products);
ProductsView.Filter = (x) => (x as Product).Name.Contains("berry");
SelectedProducts = new ObservableCollection<Product>();
SelectedProducts.Add(null);
SelectedProducts.Add(null);
SelectedProducts.Add(null);
InitializeComponent();
DataContext = this;
}
}
public class Product
{
public string Name { get; set; }
public override string ToString()
{
return Name;
}
}
}
使用System.Collections.Generic;
使用System.Collections.ObjectModel;
使用System.Windows;
使用System.Windows.Data;
命名空间WpfApplication2
{
公共部分类主窗口:窗口
{
公共列表产品{get;set;}
公共ListCollectionView产品视图{get;set;}
公共ObservableCollection SelectedProducts{get;set;}
公共主窗口()
{
产品=新列表();
添加(新产品{Name=“Apple”});
添加(新产品{Name=“Orange”});
添加(新产品{Name=“Banana”});
添加(新产品{Name=“Pear”});
添加(新产品{Name=“草莓”});
添加(新产品{Name=“Raspberry”});
ProductsView=新列表集合视图(产品);
ProductsView.Filter=(x)=>(x作为产品).Name.Contains(“berry”);
SelectedProducts=新的ObservableCollection();
SelectedProducts.Add(空);
SelectedProducts.Add(空);
SelectedProducts.Add(空);
初始化组件();
DataContext=this;
}
}
公共类产品
{
公共字符串名称{get;set;}
公共重写字符串ToString()
{
返回名称;
}
}
}
使用视图时,SelectedItem与CurrentItem同步。要抑制同步集属性,请执行以下操作:
IsSynchronizedWithCurrentItem="False"
在组合框上。使用视图时,SelectedItem与CurrentItem同步。要抑制同步集属性,请执行以下操作:
IsSynchronizedWithCurrentItem="False"
在组合框上。使用视图时,SelectedItem与CurrentItem同步。要抑制同步集属性,请执行以下操作:
IsSynchronizedWithCurrentItem="False"
在组合框上。使用视图时,SelectedItem与CurrentItem同步。要抑制同步集属性,请执行以下操作:
IsSynchronizedWithCurrentItem="False"
在组合框上