2017-06-01 67 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 –

相關問題