绑定ComboBox以使用XAML更改另一个ComboBox?

时间:2016-12-29 19:47:57

标签: c# wpf visual-studio xaml combobox

我已经制作了一个可视化的小示例项目。我有一个包含许多组合框的项目,这些组合框会相互影响我需要将其应用到。

我有两个组合框,数字颜色

数字中的 SelectedItem 会更改 项目 & 颜色中的 SelectedItem

如何使用WPF XAML Binding ItemSource和SelectedItem执行此操作?

  1. 使用ICollection?

  2. 从ObservableCollection添加/删除项目?

  3. 创建一个List作为Collection的ItemSource?

  4. 使用Add()/ Remove()或Swap the Entire分别更改项目 ItemSource是另一个?

  5. comboBoxNumers = 1,2,3,4

    comboBoxColors =红色,绿色,蓝色

    • 1→红色
    • 2→绿色
    • 3→蓝色
    • 4→删除红色,绿色。添加黄色。

    • 1,2或3→删除黄色(如果存在)。添加红色,绿色(如果不存在)。

    1→红色

    1 - Red

    2→绿色

    2 - Green

    4→黄色(删除红色/绿色)

    enter image description here

    老C#方式我正在使用:

    填充ComboBox

    onNestedScroll

    1→红色

    List<string> NumbersItems = new List<string>() { "1", "2", "3", "4" };
    NumbersItems.ForEach(i => comboBoxNumbers.Items.Add(i));
    
    List<string> ColorsItems = new List<string>() { "Red", "Green", "Blue" };
    ColorsItems.ForEach(i => comboBoxColors.Items.Add(i));
    

    2→绿色

    // Numbers 1
    if ((string)comboBoxNumbers.SelectedItem == "1")
    {
        // Remove Yellow if Exists
        if (comboBoxColors.Items.Contains("Yellow")) { 
            comboBoxColors.Items.RemoveAt(comboBoxColors.Items.IndexOf("Yellow")); 
        }
    
        // Add Red if Does Not Exist
        if (!comboBoxColors.Items.Contains("Red")) { 
            comboBoxColors.Items.Insert(0, "Red"); 
        }
    
        // Select Red
        comboBoxColors.SelectedItem = "Red";
    }
    

    4→黄色(删除红色/绿色)

    // Numbers 2
    if ((string)comboBoxNumbers.SelectedItem == "2")
    {
        // Remove Yellow if Exists
        if (comboBoxColors.Items.Contains("Yellow")) { 
            comboBoxColors.Items.RemoveAt(comboBoxColors.Items.IndexOf("Yellow")); 
        }
    
        // Add Green if Does Not Exist
        if (!comboBoxColors.Items.Contains("Green")) { 
            comboBoxColors.Items.Insert(1, "Green"); 
        }
    
        // Select Green
        comboBoxColors.SelectedItem = "Green";
    }
    

1 个答案:

答案 0 :(得分:1)

您可以通过在ViewModel中设置两个ICollections来实现此目的,该视图将被设置为窗口的datacontext。这是更好的方法,并专注于数据绑定和MVVM。 另外,将一个comboBox的SelectedItem绑定到viewmodel中的属性。因此,当从第一个组合中选择一个数字时,它将调用绑定属性的setter,并且在这个setter中,你可以修改第二个ICollection(Colors),它将绑定到第二个组合框,即

brm

在ViewModel中

<ComboBox name="numberCmb" ItemsSource = {Binding Numbers} SelectedItem ={Binding SelectedNumber../>

<ComboBox name="colorsCmb" ItemsSource = {Binding Colors} SelectedItem ={Binding SelectedColor../>

您可以创建类似

的方法
public ICollection Numbers {get;set {RaisePropertyChanged("Numbers")}
public ICollection Colors {get;set {RaisePropertyChanged("Colors")}

public int SelectedNumber 
{
get{ return _selectedNumber; }
set
{
_selectedNumber = value;
RaisePropertyChanged("SelectedNumber");
//
Here Modify the Colors collections by calling other method which can filter or modify Colors using LINQ i.e.
ModifyColorsCollection(value);
    //
}