如何通过偏移将组合框绑定到除实际值之外的其他值?

时间:2015-11-01 16:18:42

标签: c# wpf xaml combobox ivalueconverter

我有一个标记如下的组合框。

<ComboBox SelectedIndex="{Binding Path=Bonkey}">
  <ComboBoxItem Content="Monkey" />
  <ComboBoxItem Content="Donkey" />
</ComboBox>

根据下面的声明,我绑定到 Bonkey 字段类型为整数的对象。

class Thingy
{
  public int Bonkey {get; set; }
  ...
}

虽然它很有效并且应该如此,但是有一个程序性的技术问题让我夜不能寐。手动标记中生成的索引是0和1.但是,我知道整数的值将是1和2.(即, Monkey 在与组合框项目相关时被索引为0但是它在用作数据源的对象中的实际值是1.类似地, Monkey 在组合框的项目中具有索引1,但它对应于对象中的2。)

我的中间解决方案是在设置数据上下文之前在构造函数中敲除1,然后在处理视图时将其激活1。这是有效的,但我不能自豪,可以这么说。

public SomeDialog(Thingy thingy)
{
  InitializeComponent();
  thingy.Bonkey--;
  DataContext = thingy;
}
...
private void Cancel_Click(object sender, RoutedEventArgs eventArgs)
{
  DialogResult = false;
  DataContext.Bonkey++;
  Close();
}
...
private void Submit_Click(object sender, RoutedEventArgs eventArgs)
{
  DataContext.Bonkey++;
  ...
}

我怎样才能做得更多,嗯......不可思议?

  1. 我找不到任何属性来显式设置组合框中项目的索引。
  2. 我尝试过使用转换器但不知何故,我要么在组合框中有空的东西(没有预先选择),要么有一些奇怪的错误消息告诉我,我做了一个嘘声(因为我甚至不确定如果这是一个很好的方法我就放手。)
  3. 谷歌搜索给出了一堆结果,其中没有一个让我清楚如何抵消价值限制(虽然说实话,我怀疑我可能会使用太奇怪的关键词,因为似乎这样的问题必须'之前已经讨论过了。)

1 个答案:

答案 0 :(得分:1)

有很多涉及抵消和IValueConverter实施的问题。但浏览它们,我没有看到一个解决与偏移绑定的特定场景;许多问题涉及已经有转换器工作但有其他问题的人,而其他问题涉及的方式比这种情况更复杂。

所以,这是一个非常简单的偏移转换器实现:

class OffsetValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        int offset = int.Parse((string)parameter);

        return (int)value - offset;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        int offset = int.Parse((string)parameter);

        return (int)value + offset;
    }
}

像这样使用:

<ComboBox SelectedIndex="{Binding OffsetValue,
                          Converter={StaticResource offsetValueConverter1},
                          ConverterParameter=1}"/>

当然,您有一个声明的资源可以使转换器的实例可用,例如:

<Window.Resources>
  <l:OffsetValueConverter x:Key="offsetValueConverter1"/>
</Window.Resources>

还有其他实现选项,例如为转换器实例本身提供一个属性来设置控制偏移量,或者将偏移量指定为实际int值,这样就不必对其进行解析,但是这些方法有其自身的局限性,例如无法为不同的偏移重用相同的实例,或者分别在XAML中需要更详细的声明。我认为上述内容在便利性和效率之间取得了很好的平衡。


另见相关问题:
How can I bind one property to another property, offset by a specific amount?
Applying transforms from DataTemplates in WPF

There are others,但这些似乎与您自己的情景最密切相关。