【问题标题】:WPF Converting selected value from checkboxWPF从复选框转换选定的值
【发布时间】:2018-03-27 23:48:07
【问题描述】:

我有一个问题,我在 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 只是一个整数列表,但我需要一些默认值,所以我添加了 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";

有没有办法解决这个问题?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    另一种解决方案是绑定到字典,其中 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 是字典中的键(在 ComboBox 中选择某些内容后,它将存储在 SelectedValue 中)

    【讨论】:

      【解决方案2】:

      @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>
      

      【讨论】:

        【解决方案3】:

        您无需将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 值。

        【讨论】:

          猜你喜欢
          • 2015-01-24
          • 2010-10-26
          • 1970-01-01
          • 2020-06-27
          • 1970-01-01
          • 1970-01-01
          • 2016-09-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多