Подтвердить что ты не робот

Как передать GridView как ConverterParameter

Я пытаюсь передать ListView или GridView в качестве ConverterParameter Однако в подпрограмме "Конвертер" параметр поступает как строка типа

Ниже приведена часть списка XAML List и класса Converter.

Любая помощь очень ценится. Благодарю!!!

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

}
}
4b9b3361

Ответ 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 и поэтому не может быть привязан.

Однако вы можете определить свой Binding в коде, а не делать это в части XAML.

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

Пожалуйста, ознакомьтесь с ограничениями на ConvertParameter здесь

Ответ 3

Вы можете использовать ConverterParameter={Binding ElementName=[insert x:Name of grid view]}

Хотя IMHO я бы пересмотрел необходимость - действительно ли вам нужно передать UIControl в качестве параметра Converter?