How to pass GridView as a ConverterParameter

13.3k views Asked by At

I am trying to pass the ListView or the GridView as a ConverterParameter However, in the Converter routine the parameter is coming as a type string

Below is the part of the XAML List view and the Converter class.

Any help greatly appreciated. Thanks!!!

    <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>

Converter:

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();
    }

}
}
3

There are 3 answers

2
Gishu On

You could use ConverterParameter={Binding ElementName=[insert x:Name of grid view]}

Although IMHO I'd reconsider the need - do you really need to pass a UIControl as a Converter parameter?

2
Luis Filipe On

You can't bind to it.

ConvertParameter inherits from Object and therefore is not bindable.

You can, however, define your Binding in the code behind instead of doing it in the XAML part.

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

Please read about the limitations on the ConvertParameter here

1
brunnerh On

From .NET 4 onwards you could use x:Reference which allows you to avoid a ElementName binding which can only be set on dependency properties while achieving pretty much the same thing.

Due to cyclical dependency restrictions you cannot reference a control inside itself or its ancestors in the tree. You can however move the binding up a level and just inherit the DataContext, e.g.

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