WPF ComboBox选择导致在第二个ComboBox中进行选择

埃罗塔夫拉斯

我将两个组合框绑定到同一listviewcollection。问题在于,在一个组合框中选择一个值会导致另一个组合框选择的项目更改为第一个组合框的确切值。它们是耦合的,我希望它们彼此独立。

MyListViewCollection是这样的

modelsView = new ListCollectionView(MainVM.All_Models);

All_Models 是这样的可观察的自定义对象集合

public ObservableCollection<MLModel> All_Models { get; set; } = new ObservableCollection<MLModel>() { };

我将两个ComboBox绑定为modelsview这样

<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>

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication3
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            DataContext = new ViewModel();
        }
    }
}

MLModel.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WpfApplication3
{
    public class MLModel
    {
        public string Name { get; set; }
        public string Type { get; set; }
    }
}

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();
            }
        }
    }
}
彼得·杜尼奥(Peter Duniho)

文档中

如果目标是ItemsControl,则当前项目与所选项目同步。

您正在ListCollectionView两个ComboBox对象之间共享相同的内容这意味着当前选定的项目将在视图中更新,并在ItemsControl使用同一视图的任何其他项目复制

如果您不希望出现这种情况,则需要为每个对象赋予ComboBox自己的ListCollectionView对象以进行绑定。

或者,您可以将IsSynchronizedWithCurrentItem每个属性设置ComboBoxfalse

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

需要基于第二个ComboBox的SelectedValue设置WPF MVVM ComboBox ItemsSource的简单工作示例

来自分类Dev

WPF-在第一个组合框选择上启用第二个组合框

来自分类Dev

WPF 在一个 ListBox 中选择项目并在第二个 ListBox 中显示相应的列表

来自分类Dev

WPF LiveCharts 样式:多个图表导致第二个图表出错

来自分类Dev

在第二个屏幕上放置WPF ContextMenu

来自分类Dev

WPF findancestor无法处理第二个项目

来自分类Dev

如何在WPF的第二个屏幕中启动第二个应用程序?

来自分类Dev

使用MVVM在WPF中进行COMBOBOX筛选

来自分类Dev

使用MVVM在WPF中进行COMBOBOX筛选

来自分类Dev

WPF-从第二个窗口返回第一个窗口

来自分类Dev

如何在WPF中向第二个实体添加CRUD操作

来自分类Dev

Windows 10中的第二个屏幕上的WPF窗口对象被涂黑

来自分类Dev

WPF禁用主窗口,而第二个窗口打开直到关闭

来自分类Dev

关闭在MainWindow WPF中创建的第二个窗口

来自分类Dev

方法运行时打开第二个窗口-WPF

来自分类Dev

从两个表中进行选择,其中第二个表为LIMIT 1

来自分类Dev

我希望在第一个comboBox中选择的城市不出现在第二个comboBox中

来自分类Dev

WPF-在自定义ComboBox中进行绑定

来自分类Dev

WPF:从XAML设置ViewModel,为什么第二个解决方案不起作用?

来自分类Dev

主窗口上的文本框必须更改 wpf 中第二个窗口上的标签内容

来自分类Dev

WPF DataGridTemplateColumn ComboBox选择项目后显示文本

来自分类Dev

WPF DataGrid:如何确定ComboBox选择更改所在的行的索引?

来自分类Dev

CSS选择的第二个孩子,从第二个开始

来自分类Dev

CSS选择的第二个孩子,从第二个开始

来自分类Dev

如何将第二个表的两个条目作为两列,以便从第一个表中进行选择查询?

来自分类Dev

从第二个输入文件中选择音频以进行ffmpeg电影叠加

来自分类Dev

在wpf中的Datagrid中进行搜索的最佳选择是哪个工具?

来自分类Dev

css-如何选择第二个段落

来自分类Dev

选择美丽的汤汤第二个孩子。select?

Related 相关文章

  1. 1

    需要基于第二个ComboBox的SelectedValue设置WPF MVVM ComboBox ItemsSource的简单工作示例

  2. 2

    WPF-在第一个组合框选择上启用第二个组合框

  3. 3

    WPF 在一个 ListBox 中选择项目并在第二个 ListBox 中显示相应的列表

  4. 4

    WPF LiveCharts 样式:多个图表导致第二个图表出错

  5. 5

    在第二个屏幕上放置WPF ContextMenu

  6. 6

    WPF findancestor无法处理第二个项目

  7. 7

    如何在WPF的第二个屏幕中启动第二个应用程序?

  8. 8

    使用MVVM在WPF中进行COMBOBOX筛选

  9. 9

    使用MVVM在WPF中进行COMBOBOX筛选

  10. 10

    WPF-从第二个窗口返回第一个窗口

  11. 11

    如何在WPF中向第二个实体添加CRUD操作

  12. 12

    Windows 10中的第二个屏幕上的WPF窗口对象被涂黑

  13. 13

    WPF禁用主窗口,而第二个窗口打开直到关闭

  14. 14

    关闭在MainWindow WPF中创建的第二个窗口

  15. 15

    方法运行时打开第二个窗口-WPF

  16. 16

    从两个表中进行选择,其中第二个表为LIMIT 1

  17. 17

    我希望在第一个comboBox中选择的城市不出现在第二个comboBox中

  18. 18

    WPF-在自定义ComboBox中进行绑定

  19. 19

    WPF:从XAML设置ViewModel,为什么第二个解决方案不起作用?

  20. 20

    主窗口上的文本框必须更改 wpf 中第二个窗口上的标签内容

  21. 21

    WPF DataGridTemplateColumn ComboBox选择项目后显示文本

  22. 22

    WPF DataGrid:如何确定ComboBox选择更改所在的行的索引?

  23. 23

    CSS选择的第二个孩子,从第二个开始

  24. 24

    CSS选择的第二个孩子,从第二个开始

  25. 25

    如何将第二个表的两个条目作为两列,以便从第一个表中进行选择查询?

  26. 26

    从第二个输入文件中选择音频以进行ffmpeg电影叠加

  27. 27

    在wpf中的Datagrid中进行搜索的最佳选择是哪个工具?

  28. 28

    css-如何选择第二个段落

  29. 29

    选择美丽的汤汤第二个孩子。select?

热门标签

归档