2011-06-16 79 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。

一旦上下文被設置,您的轉換器應該再次被調用。

相關問題