Pergunta

Eu estou tentando criar um AttachedProperty para uma DataGridColumn dentro Silverlight 3.0 e estou tendo alguns problemas.

Aqui está a AttachedProperty:

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 você pode ver é muito simples, eu estou tentando superar a limitação que a propriedade de cabeçalho na classe DataGridColumn não pode ser ligado.

Este XAML funciona como esperado ...

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

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

No entanto, este XAML gera um erro ... (Especificamente: {System.Windows.Markup.XamlParseException: AG_E_PARSER_PROPERTY_NOT_FOUND [Linha: 224 Posição: 112] em System.Windows.Application.LoadComponent (componente objecto, Uri resourceLocator) ....})

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

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

Apenas para a experimentação me acompanha esta propriedade (com a sintaxe de ligação acima) para um DataGrid e verificado a propriedade DataGridColumnHelper.Header no método OnHeaderPropertyChanged eo valor estava correto (e uma exceção não foi lançado)

É meu entendimento que o objeto que o AttachedProperty está ligado à deve ser um DependencyProperty. Olhando através do refletor, DataGridColumn (do qual deriva DataGridTextColumn) deriva DependencyProperty.

Pode alguém por favor lançar alguma luz sobre isso? Eu estou tentando Localize a nossa aplicação, e eu estou tendo problemas com o DataGrid. Tenho certeza de que posso fazer isso no código-behind, mas eu estou tentando evitar isso.

Foi útil?

Solução

Chris, o problema é muito simples, isto não vai funcionar porque o DataGridTextColumn é "separado" da Visual Tree. Seu objeto DataGridTextColumn está enraizada na coleção de colunas do DataGrid - ver o engano. Então propriedades mesmo anexados não vai funcionar como você espera. Agora há uma maneira de fazer todo esse trabalho usando algo que eu estou chamando anexada ligações, ver:

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

Apenas lembre-se de anexar as propriedades de ligação usando algo que está no VisualTree (para que a grade segurando a coluna faria muito bem.)

Espero que isso ajude.

Outras dicas

Tente usar isso, im assumindo UserName é uma propriedade na sua viewmodel

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

Eu não posso testar seu cenário assim que meu post é apenas uma idéia. Pode funcionar, talvez não.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top