我在WPF Telerik网格中有一列需要基于两件事进行限制。
ViewModel上的IsEditable属性和IsManualChange属性,后者是网格绑定到的List的属性。。。
我写了一个MultiBoolConverter来处理这个问题,并在WPF中实现如下:
<telerik:GridViewComboBoxColumn
Header="Selection"
DataMemberBinding="{Binding HandHeldDifference.GRSSelection}"
ItemsSource="{Binding Path=SelectionOptions}">
<telerik:GridViewComboBoxColumn.IsReadOnly>
<MultiBinding Converter="{StaticResource MultiBoolConv}"
ConverterParameter="True">
<Binding
RelativeSource="{RelativeSource FindAncestor,
AncestorType={x:Type StackPanel}}"
Path="DataContext.IsEditable" />
<Binding Path="IsManualChange" />
</MultiBinding>
</telerik:GridViewComboBoxColumn.IsReadOnly>
</telerik:GridViewComboBoxColumn>
然而,进入转换器的值是bool(来自ViewModel)和IsManualChange!
public object Convert(object[] values,
Type targetType,
object parameter,
CultureInfo culture)
{
var defaultReturn = false;
if (parameter != null)
{
bool.TryParse(parameter.ToString(), out defaultReturn);
}
if (values == null) return defaultReturn;
if (values.Length < 2) return defaultReturn;
if (values[0] is bool && values[1] is bool)
{
return ((bool) values[0]) && ((bool) values[1]);
}
return defaultReturn;
}
第二个值显然没有通过"values[1]is bool"比较
一个线索可能是转换器只被调用一次,而不是像我预期的那样每行调用一次。
有人知道我该怎么做吗?
在传递DataContext之前,您将获得DependencyProperty.UnsetValue,并且需要处理这种情况。所以你可以做一些类似的事情:
bool isManualChange= (value[1] is bool) ? (bool)value[1] : false; // or true depending on which should be the default
从上面的链接:
UnsetValue是一个哨兵值用于WPF属性系统无法确定请求的DependencyProperty值。使用UnsetValue而不是null,因为null可能是有效的属性值,以及有效的(和常用)默认值。
所以基本上DataContext当前为null,所以它找不到名为IsManualChange
的属性,所以您得到UnsetValue。
一旦设置了上下文,就应该再次调用转换器。
原来Telerik网格将IsReadOnly绑定到ViewModel,并且当您想绑定到ItemsSource中的项时,必须使用IsReadOnlyBinding!