带有ViewModel参数的WPF转换器

时间:2013-02-14 14:38:03

标签: c# .net wpf xaml mvvm

我想借助ViewModel中的属性转换列表视图的项目。 我没有让它工作......带转换器的列是空的 永远不会达到转换方法。在输出窗口中显示以下消息:

  

System.Windows.Data错误:2:找不到管理FrameworkElement   或目标元素的FrameworkContentElement。   BindingExpression:路径= ObjectDefinition;的DataItem = NULL;目标要素   是'OsGuidToNameConverter'(HashCode = 66244779);目标属性是   'BindableConverterParameter'(输入'XmlDocument')

在此消息出现后,运行时填充ObjectDefinition

这样做的最佳做法是什么

XAML

<Window.Resources>
    <ResourceDictionary>
        <local:OsGuidToNameConverter x:Key="formatter" BindableConverterParameter="{Binding Path=ObjectDefinition}" />
    </ResourceDictionary>
</Window.Resources>

<ListView Grid.Row="2" Name="listView1" ItemsSource="{Binding Path=Config.DocumentTypes}">
    <ListView.View>
        <GridView>
            <GridViewColumn Width="140" Header="Objekttyp" DisplayMemberBinding="{Binding ObjektTyp}"  />
            <GridViewColumn Width="140" Header="Bezeichnung">
                <GridViewColumn.DisplayMemberBinding>
                    <Binding Path="Value" Converter="{StaticResource formatter}" />
                </GridViewColumn.DisplayMemberBinding>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

转换器

public class OsGuidToNameConverter : DependencyObject, IValueConverter
{
    public static DependencyProperty BindableConverterParameterProperty =
         DependencyProperty.Register("BindableConverterParameter", typeof(XmlDocument),
         typeof(OsGuidToNameConverter));

    public XmlDocument BindableConverterParameter
    {
        get { return (XmlDocument)GetValue(BindableConverterParameterProperty); }
        set { SetValue(BindableConverterParameterProperty, value); }
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (BindableConverterParameter is XmlDocument)
        {
            try
            {
                FieldParameter definitionForField = (FieldParameter)ObjectDefinitionHelper.GetObjectDefinitionByAttribute((string)value, SuchFeldTypes.osguid, BindableConverterParameter, SuchFeldTypes.name);
                return definitionForField.Value;
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return "";
            }
        }
        else
        {
            return "";
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return "";
    }
}

1 个答案:

答案 0 :(得分:1)

您的问题出在错误消息

  

System.Windows.Data错误:2:找不到管理FrameworkElement   或目标元素的FrameworkContentElement。   BindingExpression:路径= ObjectDefinition;的的DataItem =空;目标要素   是'OsGuidToNameConverter'(HashCode = 66244779);目标属性是   'BindableConverterParameter'(输入'XmlDocument')

转化器后面的DataContextDataItem)为null,因此无法找到属性"ObjectDefinition"

尝试将转换器移至<GridViewColumn.Resources>,使其具有正确的DataContext绑定,或切换到IMultiValueConverter,以便传递多个绑定值。

第三种方法也是使用Converter将整个数据项传递给{Binding },然后将其转换为您的数据类型,然后您就可以访问Value和{{1它的属性来执行转换。