2017-06-01 68 views
-1

我真的不知道如何去做我想做的事。所以我来这里问你。为每个ComboBox C#MVVM选择一个独特的项目

在我的窗户上,我有6 ComboBox
如果我在ComboBox中选择了一个项目(例如显示的项目1),我想为其他项目禁用此item1
如果我下拉第二个ComboBox,我不能选择item1并选择item2
在第三个ComboBox中,将无法选择item1item2。等...

我使用WPF和MVVM。

请问您能帮我吗?

编辑

我已经实现埃德宾吉的解决方案:
我的转换器: 我拿项目的字符串,并包含选定的项目

class ComboBoxItemDisableConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (values[0].Equals("")) 
     { 
      return false; 
     } 

     bool contains = !(values[1] as List<string>).Contains(values[0].ToString()); 
     return contains; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

字符串列表我不会告诉你所有的xaml文件,但只有重要的代码:
所有的ComboBox都是一样的。

<Window.DataContext> 
    <vm:MainViewModel /> 
</Window.DataContext> 
<Window.Resources> 
    <converters:ComboBoxItemDisableConverter x:Key="comboBoxItemDisableConverter" /> 
</Window.Resources> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 
    <ComboBox Grid.Row="0" 
       Grid.Column="0" 
       ItemsSource="{Binding ListeComposants}" 
       SelectedItem="{Binding SelectedItemPrimaire00}"> 
     <ComboBox.ItemContainerStyle> 
      <Style TargetType="ComboBoxItem"> 
       <Setter Property="IsEnabled"> 
        <Setter.Value> 
         <MultiBinding Converter="{StaticResource comboBoxItemDisableConverter}"> 
          <Binding /> 
          <Binding Path="DataContext.SelectedItemsVuePrimaire" 
            RelativeSource="{RelativeSource AncestorType={x:Type Window}}" /> 
         </MultiBinding> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </ComboBox.ItemContainerStyle> 
    </ComboBox> 

没有代码背后。
在我的ViewModel,我把SelectedItem名为

class MainViewModel : ViewModelBase, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private List<string> _selectedItemsVuePrimaire = new List<string> { "", "", "", "", "", "" }; 

    public List<string> ListeComposants { get; set; } 

    public List<string> SelectedItemsVuePrimaire 
    { 
     get { return _selectedItemsVuePrimaire; } 
     set 
     { 
      _selectedItemsVuePrimaire = value; 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SelectedItemsVuePrimaire))); 
     } 
    } 

    private string _selectedItemPrimaire00; 

    public string SelectedItemPrimaire00 
    { 
     get { return _selectedItemPrimaire00; } 
     set 
     { 
      _selectedItemPrimaire00 = value; 
      SelectedItemsVuePrimaire[0] = _selectedItemPrimaire00; 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SelectedItemPrimaire00))); 
     } 
    } 

    private string _selectedItemPrimaire01; 

    public string SelectedItemPrimaire01 
    { 
     get { return _selectedItemPrimaire01; } 
     set 
     { 
      _selectedItemPrimaire01 = value; 
      SelectedItemsVuePrimaire[1] = _selectedItemPrimaire01; 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SelectedItemPrimaire01))); 
     } 
    } 

    public MainViewModel() 
    { 
     ListeComposants = new List<string>(); 
     ListeComposants.Add(""); 
     ListeComposants.Add("Dernières commandes"); 
     ListeComposants.Add("Fournisseurs"); 
     ListeComposants.Add("Relevé de prix"); 
     ListeComposants.Add("Remises financières"); 
     ListeComposants.Add("Historique E/S x mois"); 
     ListeComposants.Add("Prévisions"); 
     ListeComposants.Add("Equivalences"); 
     ListeComposants.Add("Caractéristiques"); 
     ListeComposants.Add("UG"); 
    } 

一个List<string>``对于每个第一dropdowlist开放,下拉列表调用转换器,但如果我打开第二次的下拉列表中,该转换器不是调用...

SOLUTION

添加我selectedItems的列表的的PropertyChanged当将selectedItem改变

private string _selectedItemPrimaire00; 

    public string SelectedItemPrimaire00 
    { 
     get { return _selectedItemPrimaire00; } 
     set 
     { 
      _selectedItemPrimaire00 = value; 
      SelectedItemsVuePrimaire[0] = _selectedItemPrimaire00; 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SelectedItemsVuePrimaire))); 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SelectedItemPrimaire00))); 
     } 
    } 
+0

添加检查项目选择,以检查它是否在其他组合框中被选中 –

回答

0

为viewmodel提供一个属性,该属性是所有选定项目的集合。我们将其称为SelectedItems。当选择更改时更新SelectedItems,并为该集合属性提升PropertyChanged。每个选择都需要绑定到视图模型属性。

为每个组合框指定一个带有DataTrigger的ItemContainerTemplate。

为DataTrigger提供多重绑定,其中包括<Binding/><Binding DataContext.SelectedItems, RelativeSource={RelativeSource AncestorType=ComboBox}}" />。如果在values[1]SelectedItems)中包含values[0]<Binding/>),则给出多重联结的多值转换器(IMultiValueConverter),返回true

如果多值转换器返回true,触发器将触发并将IsEnabled设置为False

+0

如果我在DataTigger中使用MultiBinding,我在'SetterBaseCollection'集合中有一个错误“无法使用'MultiBinding'”。 –

+1

非常感谢,我找到了解决方案! :d –

相关问题