2012-04-11 16 views
11

Estoy tratando de pasar el ListView o GridView como ConverterParameter Sin embargo, en la rutina del convertidor del parámetro viene como una cadena tipoCómo pasar GridView como ConverterParameter

a continuación es la parte de la Lista de XAML ver y la clase Convertidor.

Cualquier ayuda muy apreciada. ¡¡¡Gracias!!!

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

Convertidor:

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

} 
} 

Respuesta

-3

Usted podría utilizar ConverterParameter={Binding ElementName=[insert x:Name of grid view]}

Aunque en mi humilde opinión vez lo consideraría la necesidad - lo que realmente necesita para pasar un uicontrol como un parámetro del convertidor?

+0

En tiempo de ejecución en la clase parcial, aparece este error emergente: No se puede establecer un 'Enlace' en la propiedad 'ConvertidorParámetro' del tipo 'Encuadernación'. Un 'Enlace' solo se puede establecer en una DependencyProperty de un DependencyObject. –

+0

@IrmiMrm - Respuesta corta ... no se puede hacer eso ... fácilmente. Solo puede enlazar a propiedades DP en derivaciones de DependencyObject. La vinculación no cumple los requisitos: está intentando especificar una vinculación para la propiedad ElementName de otra vinculación. Parece demasiado intrincado ... debe existir una solución más simple al problema. – Gishu

6

No se puede vincular a ella.

ConvertParameter hereda de Object y, por lo tanto, no es enlazable.

Sin embargo, puede definir su Enlace en el código subyacente en lugar de hacerlo en la parte XAML.

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

Lea acerca de las limitaciones en el ConvertParameter here

+0

Suena bien, lo intentaré, ¡Gracias! –

+0

@Luis Filipe: no estoy seguro acerca de la publicación vinculada. IMHO ViewModels no debe contener ninguna propiedad de dependencia. Asocio los DPs más con Vistas/Controles que con View-agnostic ViewModels. – Gishu

+0

'ConverterParameter' no hereda de nada, es una propiedad, el problema es que' MarkupExtension' no hereda de 'DependencyObject'. –

17

De .NET 4 en adelante se podría utilizar x:Reference que le permite evitar una unión ElementName que sólo se puede configurar en las propiedades de dependencia mientras que el logro más o menos la la misma cosa.

Debido a restricciones de dependencia cíclicas no puede hacer referencia a un control dentro de sí mismo o sus antepasados ​​en el árbol. Sin embargo, puede mover el enlace un nivel y heredar el DataContext, p.

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

* no puede hacer referencia a un control dentro de sí mismo o sus descendientes *. Te refieres ** antepasados ​​**. No puedes hacer referencia a los antepasados. – AgentFire

Cuestiones relacionadas