Pregunta

Estoy intentando crear una AttachedProperty para una DataGridColumn dentro de Silverlight 3.0 y tengo algunos problemas.

Aquí está la propiedad adjunta:

public class DataGridColumnHelper
{
    public static readonly DependencyProperty HeaderProperty =
        DependencyProperty.RegisterAttached("Header", typeof(string), typeof(DataGridColumnHelper),
                                            new PropertyMetadata(OnHeaderPropertyChanged));

    private static void OnHeaderPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        string header = GetHeader(d);

        var dataGridColumn = d as DataGridColumn;

        if (dataGridColumn == null)
        {
            return;
        }

        dataGridColumn.Header = GetHeader(dataGridColumn);
    }

    public static string GetHeader(DependencyObject obj)
    {
        return (string)obj.GetValue(HeaderProperty);
    }

    public static void SetHeader(DependencyObject obj, string value)
    {
        obj.SetValue(HeaderProperty, value);
    }

}

Como puede ver, es realmente simple, estoy tratando de superar la limitación de que la propiedad de encabezado en la clase DataGridColumn no se puede vincular.

Este XAML funciona como se esperaba ...

<Controls:DataGridTextColumn Binding="{Binding OwnerName}"                                                                         
                         HeaderStyle="{StaticResource DataGridColumnHeaderStyle}"

                         Behaviors:DataGridColumnHelper.Header="User Name"/>

Sin embargo, este XAML arroja un error ... (Específicamente: {System.Windows.Markup.XamlParseException: AG_E_PARSER_PROPERTY_NOT_FOUND [Línea: 224 Posición: 112]    en System.Windows.Application.LoadComponent (componente de objeto, Uri resourceLocator)    ....})

<Controls:DataGridTextColumn Binding="{Binding OwnerName}"                                                                         
                         HeaderStyle="{StaticResource DataGridColumnHeaderStyle}"

                         Behaviors:DataGridColumnHelper.Header="{Binding Resources.UserNameListViewHeading, Source={StaticResource Labels}}"/>

Solo para experimentación, adjunté esta propiedad (con la sintaxis de enlace anterior) a un DataGrid y verifiqué la propiedad DataGridColumnHelper.Header en la OnHeaderPropertyChanged método y el valor era correcto (y no se produjo una excepción)

Entiendo que el objeto al que se adjunta AttachedProperty debe ser un DependencyProperty . Mirando a través de Reflector, DataGridColumn (del cual DataGridTextColumn deriva) deriva de DependencyProperty .

¿Alguien puede arrojar algo de luz sobre esto? Estoy tratando de localizar nuestra aplicación y tengo problemas con DataGrid. Estoy seguro de que puedo hacer esto con código subyacente, pero estoy tratando de evitarlo.

¿Fue útil?

Solución

Chris, el problema es muy simple, esto no funcionará porque DataGridTextColumn está " separado " del árbol visual. Su objeto DataGridTextColumn está enraizado en la colección Columns de DataGrid; consulte la dirección indirecta. Por lo tanto, incluso las propiedades adjuntas no funcionarán como espera. Ahora hay una manera de hacer que todo esto funcione usando algo que llamo enlaces adjuntos, vea:

http://www.orktane.com/Blog/post/2009/09/29/Introducing-nRouteToolkit-for-Silverlight- (Part-I) .aspx

Solo recuerde adjuntar las propiedades de enlace usando algo que esté en VisualTree (para que la cuadrícula que sostiene la columna funcione bien).

Espero que esto ayude.

Otros consejos

Intente usar esto, supongo que UserName es una propiedad en su modelo de vista

    <Controls:DataGridTextColumn Binding="{Binding OwnerName}"                                                                         
HeaderStyle="{StaticResource DataGridColumnHeaderStyle}"
Behaviors:DataGridColumnHelper.Header="{Binding UserName}"/>

No puedo probar tu escenario, así que mi publicación es solo una idea. Podría funcionar, puede que no.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top