2011-08-08 11 views
13

que estoy tratando de convertir esta unión a ella xaml es C# contraparte por varias razones:WPF Encuadernación programación

<ListView x:Name="eventListView" Grid.Column="0" Grid.Row="1" Background="LightGray" BorderThickness="0"> 
    <local:EventCell x:Name="cell" Width="{Binding ActualWidth, Converter={StaticResource ListViewWidthConverter}, ElementName=eventListView, Mode=OneWay}"/> 
</ListView> 

He leído un montón de preguntas ya que tenía problemas similares y se acercó con este código:

Binding b = new Binding(); 
b.Source = eventListView; 
b.Path = new PropertyPath(cell.Width); 
b.Converter = new ListViewWidthConverter(); 
b.Mode = BindingMode.OneWay; 
cell.SetBinding(ListView.ActualWidthProperty, b); 

Pero el código C# no se compilará, estoy bastante perdido en cuanto a por qué.

+0

¿Por qué no se compila el código? ¿Cuál es el error? –

Respuesta

16

En el constructor de la PropertyPath la cell.Width obtiene el valor, ya sea que desee EventCell.ActualWidthProperty para obtener el campo DP si se trata de un DP, o utilizar la cadena, "ActualWidth".

Al traducir XAML como este, acaba de establecer la ruta de acceso en el constructor de unión que es el mismo constructor utilizado en XAML (como el camino no está calificado):

Binding b = new Binding("ActualWidth"); 

(Si su unión iban a ser traducida en contacto con XAML sería algo así como {Binding Path=123.4, ...}, tenga en cuenta que la propiedad Path está calificado como no ha utilizado el constructor para configurarlo)

Editar: también las necesidades de unión para ser ajustado en el EventCell.WidthProperty, por supuesto, no se puede establecer el ActualWidth, parece que su lógica se invirtió ...

+0

Aún me da una XamlParseException no fue manejada. con b.Path = new PropertyPath (EventCell.WidthProperty); o b.Path = new PropertyPath ("ActualWidth"); – xvpower

+1

@xvpower: ver mi edición (y 'PropertyPath (EventCell.WidthProperty)' es incorrecto, debería ser 'PropertyPath (EventCell.ActualWidthProperty)') –

+0

¡Funciona perfectamente gracias! – xvpower

0

Creo que tiene que hacer el ActualWidthProperty lanzar un evento NotifyPropertyChanged. De lo contrario, el enlace no se actualizará cuando cambie la propiedad. Cada vez que he hecho enlaces, siempre he tenido que implementar INotifyPropertyChanged.

Puede intentar extender la clase de vista de lista y luego implementarla en la propiedad de ancho. He dado una respuesta similar aquí: WPF Toolkit DataGrid column resize event

+0

ActualWidth probablemente ya sea una DependencyProperty del control. –

+0

Ah, resulta que sí lo es. En ese caso, no necesita implementar el evento de propiedad modificada –

Cuestiones relacionadas