我真的不知道该怎么做我想要的。所以我来这里问你。
在我的窗口,我有6 ComboBox
如果我在ComboBox
中选择了一个项目(例如显示的item1),我想为其他人禁用此item1
。
如果我下拉一秒ComboBox
,我就无法选择item1
并选择item2
。
在第三个ComboBox
中,无法选择item1
和item2
。等等......
我将WPF与MVVM一起使用。
你能帮我吗?
修改
我实施了Ed Plunkett的解决方案:
我的转换器:
我取项目的字符串和包含所选项目的字符串列表
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
放在名为``
List<string>
中
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");
}
对于每个打开的第一个下拉列表,下拉列表会调用转换器,但如果我第二次打开下拉列表,则转换器不会调用...
解
当selectedItem更改
时,我添加了selectedItems列表的PropertyChanged 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
。每个选择都需要绑定到viewmodel属性。
为每个ComboBox提供一个带有DataTrigger的ItemContainerTemplate。
为DataTrigger提供包含<Binding/>
和<Binding DataContext.SelectedItems, RelativeSource={RelativeSource AncestorType=ComboBox}}" />
的多重绑定。如果IMultiValueConverter
(true
)中包含values[0]
(<Binding/>
),则为多绑定转换为values[1]
的多值转换器(SelectedItems
) 。
如果多值转换器返回true,则触发器触发并将IsEnabled
设置为False
。