我有一个问题,我在WPF中有一个看起来像这样的组合框:
<ComboBox IsSynchronizedWithCurrentItem="True"
commands:PropertyChangeBehavior.Command="{Binding GetCurrentsModuleCommand}"
SelectedItem="{Binding SelectedModule, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
<ComboBox.ItemsSource>
<CompositeCollection>
<ComboBoxItem IsEnabled="True" Content="All">
<ComboBoxItem.Tag>
<system:Int32>0</system:Int32>
</ComboBoxItem.Tag>
</ComboBoxItem>
<CollectionContainer Collection="{Binding Source={StaticResource ResourceKey=ModulesCombo}}" />
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
现在source只是一个int列表,但我需要一些默认值,所以我添加了ComboBoxItem
。现在,所选的项目属性如下所示:
private int selectedModule;
public int SelectedAModule
{
get => selectedModule;
set
{
selectedModule = value;
OnPropertyChanged();
}
}
当更改为默认值时,我正在
System.Windows.Data错误:23:无法将'System.Windows.Controls.ComboBoxItem:All'从类型'ComboBoxItem'转换为'System.Int32'类型
如果我检查命令:
public ICommand GetCurrentsModuleCommand => new Command(module =>
{
SomeLogic();
});
如果是正常值,则模块是一个数字,但如果它是全部值,我得到:
"System.Windows.Controls.ComboBoxItem: All";
有什么方法可以解决这个问题吗?
答案 0 :(得分:2)
另一种解决方案是绑定到Dictionary,其中Key被选为int,value是ComboBox项目的标签:
public Dictionary<int, string> dic { get; set; } = new Dictionary<int, string>()
{
[0] = "All",
[1] = "1",
[2] = "2"
};
具有所选值的属性:
public int SelectedValue { get; set; }
接下来,您可以像这样创建ComboBox:
<ComboBox
DisplayMemberPath="Value"
ItemsSource="{Binding dic}"
SelectedValue="{Binding SelectedValue}"
SelectedValuePath="Key" />
DisplayMemberPath是字典中的值,它将显示在ComboBox中,SelectedValue是int属性,您要存储所选索引,SelectedValuePath是Key来自字典(在ComboBox中选择内容后将存储在SelectedValue中)
答案 1 :(得分:1)
@Ann Mary建议的绑定到Dictionary
的解决方案是一个可行的解决方案(+1)。
您还可以使用知道如何将ComboBoxItem
转换为int
的自定义值转换器:
public class Converter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
ComboBoxItem cbi = value as ComboBoxItem;
if (cbi != null)
return cbi.Tag;
return value;
}
}
<强> XAML:强>
<ComboBox IsSynchronizedWithCurrentItem="True">
<ComboBox.SelectedItem>
<Binding Path="SelectedModule" Mode="TwoWay">
<Binding.Converter>
<local:Converter />
</Binding.Converter>
</Binding>
</ComboBox.SelectedItem>
<ComboBox.ItemsSource>
<CompositeCollection>
<ComboBoxItem IsEnabled="True" Content="All">
<ComboBoxItem.Tag>
<system:Int32>0</system:Int32>
</ComboBoxItem.Tag>
</ComboBoxItem>
<CollectionContainer Collection="{Binding Source={StaticResource ResourceKey=ModulesCombo}}" />
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
答案 2 :(得分:0)
您无需向ComboBoxItem
添加CompositeCollection
。 CompositeCollection
的工作是将列表和单个项目合并到一个集合中。在您的情况下,您正在合并整数列表和一个ComboBoxItem
哪个标记的值是整数。要将0
添加到列表,只需将ComboBoxItem
替换为CompositeCollection
<CompositeCollection>
<system:Int32>0</system:Int32>
<CollectionContainer Collection="{Binding Source={StaticResource ResourceKey=ModulesCombo}}" />
</CompositeCollection>
如果您需要更改该项目的文字,可以使用DateTemplateSelector。在DataTemplateSelector
中,您可以将一个DataTemplate
用于0
值,将另一个DataTemplate
用于非0
值。