2011-06-16 40 views
0

我在WPF Telerik网格中有一列,我需要根据两件事来进行限制。MultiBindingConvertor不在WPF MVVM应用程序中的网格上工作

在视图模型和IsManualChange财产是网格上绑定的列表的属性

的IsEditable财产......

我写了一个MultiBoolConvertor来处理这一点,并在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!的DependencyProperty.UnsetValue!

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; 
} 

第二值明显失败“值[1]是布尔”比较

甲线索也许该转换器只被调用一次,而不是每行如我期望。

有谁知道我可以如何得到这个工作吗?

+0

您是否尝试将PresentationTraceSources.TraceLevel = High添加到第二个Binding并检查output-Window? – WaltiD 2011-06-16 14:37:03

回答

0

发现Telerik网格将IsReadOnly绑定到ViewModel,并且当你想绑定到ItemsSource中的一个项目时你必须使用IsReadOnlyBinding!

1

在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可能是有效的属性 值,以及有效的(和 经常使用的)DefaultValue。

所以基本上DataContext目前是空的,所以它找不到名为IsManualChange的属性,所以你得到了UnsetValue。

一旦上下文被设置,您的转换器应该再次被调用。

相关问题