【问题标题】:MultiBindingConvertor not working on grid in WPF MVVM applicationMultiBindingConvertor 在 WPF MVVM 应用程序中的网格上不起作用
【发布时间】:2011-06-16 14:31:28
【问题描述】:

我在 WPF Telerik 网格中有一个列,我需要根据两件事进行限制。

ViewModel 上的 IsEditable 属性和 IsManualChange 属性,它是网格绑定到的 List 的属性 ...

我写了一个 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>

然而,进入转换器的值是布尔值(来自 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;
}

第二个值显然无法通过“values[1] is bool”比较

一个线索可能是转换器只被调用一次,而不是我期望的每行。

请问有谁知道我怎样才能让它工作?

【问题讨论】:

  • 您是否尝试将 PresentationTraceSources.TraceLevel=High 添加到您的第二个绑定并检查输出窗口?

标签: wpf mvvm multibinding


【解决方案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, 因为 null 可能是一个有效的属性 值,以及一个有效的(和 常用)DefaultValue。

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

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

【讨论】:

    【解决方案2】:

    原来 Telerik 网格将 IsReadOnly 绑定到 ViewModel,当您想绑定到 ItemsSource 中的项目时,您必须使用 IsReadOnlyBinding!

    【讨论】:

      猜你喜欢
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 2023-04-06
      • 2014-06-27
      • 1970-01-01
      • 2022-07-02
      相关资源
      最近更新 更多