WPF从复选框转换选定的值

时间:2018-03-27 12:14:44

标签: c# wpf

我有一个问题,我在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";

有什么方法可以解决这个问题吗?

3 个答案:

答案 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添加CompositeCollectionCompositeCollection的工作是将列表和单个项目合并到一个集合中。在您的情况下,您正在合并整数列表和一个ComboBoxItem哪个标记的值是整数。要将0添加到列表,只需将ComboBoxItem替换为CompositeCollection

中的整数即可
<CompositeCollection>
   <system:Int32>0</system:Int32>
   <CollectionContainer Collection="{Binding Source={StaticResource ResourceKey=ModulesCombo}}" />
</CompositeCollection>

如果您需要更改该项目的文字,可以使用DateTemplateSelector。在DataTemplateSelector中,您可以将一个DataTemplate用于0值,将另一个DataTemplate用于非0值。