如何将 GridView 作为 ConverterParameter 传递

Posted

技术标签:

【中文标题】如何将 GridView 作为 ConverterParameter 传递【英文标题】:How to pass GridView as a ConverterParameter 【发布时间】:2012-04-23 17:45:57 【问题描述】:

我正在尝试将 ListView 或 GridView 作为 ConverterParameter 传递 但是,在 Converter 例程中,参数以类型字符串的形式出现

下面是 XAML 列表视图和转换器类的一部分。

非常感谢任何帮助。谢谢!!!

    <ListView Name="SeqDtStDataListView1" Grid.Row="1" 
        DataContext="Binding Path=DisplayDT[0], Converter =StaticResource      
                                                       CNVToColumn,ConverterParameter=?????"
        VerticalContentAlignment="Stretch" VerticalAlignment="Stretch"
                                                       HorizontalAlignment="Stretch"
        SelectionChanged="SEQDatalistview_SelectionChanged"  Margin="5"> 


       <ListView.View >
             <GridView x:Name="SeqDtStDataGridView1"/>
       </ListView.View>
    </ListView>

转换器:

namespace MFTest.Converters

public class CNVToColumn : IValueConverter


    public object Convert(object value,
                          Type targetType, 
                          object parameter,
                          System.Globalization.CultureInfo culture)
    
        DataTable dt = (DataTable)value;
        GridView GV = (GridView)parameter;                <========= fail here ===========
        if (dt != null && GV != null)
          foreach (var colum in dt.Columns)               // Binding the Columns
          
                DataColumn dc = (DataColumn)colum;
                GridViewColumn column = new GridViewColumn();
                column.DisplayMemberBinding = new Binding(dc.ColumnName);
                column.Header = dc.ColumnName;
                GV.Columns.Add(column);
           
        return null;
    

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    
        throw new NotImplementedException();
    



【问题讨论】:

【参考方案1】:

从 .NET 4 开始,您可以使用 x:Reference,它允许您避免 ElementName 绑定,该绑定只能在依赖属性上设置,同时实现几乎相同的目标。

由于循环依赖限制,您不能引用控件内部或其在树中的祖先。但是,您可以将绑定向上移动一个级别并仅继承 DataContext,例如

<Border DataContext="Binding Path=DisplayDT[0],
                              Converter=StaticResource CNVToColumn,
                              ConverterParameter=x:Reference SeqDtStDataListView1">
    <ListView Name="SeqDtStDataListView1" Grid.Row="1">

【讨论】:

*您不能在其内部或其后代中引用控件*。你的意思是祖先。你不能引用祖先。【参考方案2】:

你不能绑定到它。

ConvertParameter 继承自 Object,因此不可绑定。

但是,您可以在后面的代码中定义您的绑定,而不是在 XAML 部分中进行。

System.Windows.Data.Binding b = new System.Windows.Data.Binding();
b.ConverterParameter = this;

请阅读有关 ConvertParameter here 的限制

【讨论】:

@Luis Filipe - 不确定链接的帖子。恕我直言,ViewModel 不应包含任何依赖属性。我将 DP 更多地与视图/控件相关联,而不是与视图无关的 ViewModel。 ConverterParameter 不继承自任何东西,它是一个属性,问题是 MarkupExtension 不继承自 DependencyObject【参考方案3】:

你可以使用ConverterParameter=Binding ElementName=[insert x:Name of grid view]

尽管恕我直言,我会重新考虑需要 - 您真的需要将 UIControl 作为 Converter 参数传递吗?

【讨论】:

在部分类的运行时弹出此错误:无法在“Binding”类型的“ConverterParameter”属性上设置“Binding”。只能在 DependencyObject 的 DependencyProperty 上设置“绑定”。 @IrmiMrm - 简短的回答..你不能这样做..很容易。您只能绑定到 DependencyObject 派生的 DP 属性。绑定不符合条件 - 您正在尝试为另一个绑定的 ElementName 属性指定绑定。似乎太令人费解了。必须有一个更简单的问题解决方案。

以上是关于如何将 GridView 作为 ConverterParameter 传递的主要内容,如果未能解决你的问题,请参考以下文章

VMware vCenter Converter Standalone迁移

如何将整数作为 ConverterParameter 传递?

如何以编程方式将按钮添加到 gridview 并将其分配给特定的代码隐藏函数?

如何将 @ConfigProperties 与 Converter 类一起使用

如何绑定在父 Gridview 控件的模板字段内使用的子 Gridview 控件?

如何使用 Google S2 Converter 将 markdown() 中的链接转换为与 favicon 链接?