【问题标题】:WPF Converter with parameter from ViewModel带有 ViewModel 参数的 WPF 转换器
【发布时间】:2013-02-14 14:38:02
【问题描述】:

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

System.Windows.Data 错误:2:找不到管理 FrameworkElement 或 FrameworkContentElement 为目标元素。 绑定表达式:路径=对象定义;数据项=空;目标元素 是'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 "";
    }
}

【问题讨论】:

  • 你当前的代码有什么问题?
  • 如果我知道我会纠正它。该列是空的。我也不例外
  • “列是空的”仍然不能解释问题。您是否尝试过放置断点并调试代码?
  • 永远无法达到转换方法
  • 现在我们正在取得进展。输出窗口是否提到 Value 属性的绑定有任何问题。

标签: c# .net wpf xaml mvvm


【解决方案1】:

您的问题在错误消息中

System.Windows.Data 错误:2:找不到管理 FrameworkElement 或 FrameworkContentElement 为目标元素。 绑定表达式:路径=对象定义; DataItem=null;目标元素 是'OsGuidToNameConverter' (HashCode=66244779);目标属性是 'BindableConverterParameter'(类型'XmlDocument')

你的转换器后面的DataContextDataItem)是null,所以找不到"ObjectDefinition"这个属性。

尝试将您的转换器移动到&lt;GridViewColumn.Resources&gt;,以便它具有正确的DataContext 用于绑定,或者切换到IMultiValueConverter,它可以让您传递多个绑定值。

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

【讨论】:

  • 我尝试了 MultiConverter,但我无法从 ViewModel 绑定 objectdefinition 属性? DataContext 是 Config.DocumentTypes
  • 好的。在这个线程的帮助下,我得到了这个工作:stackoverflow.com/questions/6786629/…
  • @masterchris_99 很高兴你把它整理好了 :)
猜你喜欢
  • 2013-10-09
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
相关资源
最近更新 更多