我有一个标记如下的组合框。
<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++;
...
}
我怎样才能做得更多,嗯......不可思议?
答案 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,但这些似乎与您自己的情景最密切相关。