如何设置组合框项目的可见性?

4

我有两个 WPF ComboBox(ComboBoxA,ComboBoxB),它们具有相同的 ComboBox 项(Apple 和 Orange)。假设我在 ComboBoxA 中选择“Apple”,则需要隐藏 ComboBoxB 中的“Apple”。如果我返回 ComboBoxA 并选择“Orange”,则“Apple”将可见,而“Orange”将被隐藏。我如何使用 C# 实现这一点?

xaml 的代码片段:

    <ComboBox Name="comboboxA" >
        <ComboBoxItem Content="Apple" Name="AppleA"></ComboBoxItem>
        <ComboBoxItem Content="Orange" Name="OrangeA"></ComboBoxItem>
    </ComboBox>

    <ComboBox Name="comboboxB" >
        <ComboBoxItem Content="Apple" Name="AppleB"></ComboBoxItem>
        <ComboBoxItem Content="Orange" Name="OrangeB"></ComboBoxItem>
    </ComboBox>
2个回答

4
您可以使用 sa_ddam213 提到的方法,或者您可以在 SelectionChanged 事件中直接暴力解决它,就像这样。
private void comboboxA_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    for (int i = 0; i <= comboboxB.Items.Count -1; i++)
    {
        if (((ComboBoxItem)(comboboxB.Items[i])).Content.ToString() == ((ComboBoxItem)comboboxA.SelectedItem).Content.ToString())
        {
            ((ComboBoxItem)(comboboxB.Items[i])).Visibility = System.Windows.Visibility.Collapsed;
        }
        else
            ((ComboBoxItem)(comboboxB.Items[i])).Visibility = System.Windows.Visibility.Visible;
    }
}

谢谢Mark,你的工作也非常出色。顺便问一下,我还有一个问题。当我在comboboxA中选择“apple”时,comboboxB中的“apple”将被隐藏。但是仍然会有一个空白的位置给“apple”。我能否简单地删除这个空白位置呢? - Nerdynosaur
尝试使用 System.Windows.Visibility.Collapsed 而不是 Hidden,参见编辑。 - Mark Hall

2
也许只需要从列表中过滤所选项目。
<Window x:Class="WpfApplication6.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" Name="UI">
    <Grid>
        <ComboBox ItemsSource="{Binding ElementName=UI,Path=YourCollection}" SelectedItem="{Binding ElementName=UI,Path=SelectedItem}" Height="23" HorizontalAlignment="Left" Margin="65,61,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120" />
        <ComboBox ItemsSource="{Binding ElementName=UI, Path=FilteredCollection}" Height="23" HorizontalAlignment="Left" Margin="223,61,0,0" Name="comboBox2" VerticalAlignment="Top" Width="120" />
    </Grid>
</Window>


/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
    private string _selectedItem;
    private ObservableCollection<string> _yourCollection = new ObservableCollection<string>();

    public MainWindow()
    {
        InitializeComponent();
        YourCollection.Add("Apple");
        YourCollection.Add("Banana");
        YourCollection.Add("Pear");
        YourCollection.Add("Orange");
        NotifyPropertyChanged("FilteredCollection"); 
    }

    // Collection Fro ComboBox A
    public ObservableCollection<string> YourCollection
    {
        get { return _yourCollection; }
        set { _yourCollection = value; }
    }

    // ComboBox A selected Item
    public string SelectedItem
    {
        get { return _selectedItem; }
        set
        {
            _selectedItem = value;

            // Notify the the filter collection has changed
            NotifyPropertyChanged("FilteredCollection"); 
        }
    }

    // Collection to show in ComboBox B
    public List<string> FilteredCollection
    {
        // Remove the selected Item
        get { return _yourCollection.Where(s => !s.Equals(_selectedItem)).ToList(); }
    }


    public event PropertyChangedEventHandler PropertyChanged;
    public void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }
}

或者你需要双向工作吗?


我需要添加任何引用才能使用“ObservableCollection”吗? - Nerdynosaur
是的,你需要添加: using System.Collections.ObjectModel;或者你可以把它作为List<string>,但是在添加项后你必须调用NotifyPropertyChanged("YourCollection")。Observable collection已经内置了这个功能,在添加/删除项时会更新UI,因此它是WPF非常方便的列表类型。 - sa_ddam213
嗯......组合框中没有显示任何内容。当我点击两个组合框时,它们都是空白的。 - Nerdynosaur
你在 Window 部分的 XAML 中添加了 Name="UI" 吗?随时可以发布你的 XAML 代码,这样我就可以帮助你 :) - sa_ddam213

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接