Domanda

Sto tentando di creare un AttachedProperty per un DataGridColumn all'interno di Silverlight 3.0 e sto riscontrando alcuni problemi.

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

}

Come puoi vedere è davvero semplice, sto cercando di superare la limitazione che la proprietà Header nella classe DataGridColumn non può essere associata.

Questo XAML funziona come previsto ...

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

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

Tuttavia, questo XAML genera un errore ... (In particolare: {System.Windows.Markup.XamlParseException: AG_E_PARSER_PROPERTY_NOT_FOUND [Riga: 224 posizione: 112]    at System.Windows.Application.LoadComponent (Componente oggetto, Uri resourceLocator)    ....})

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

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

Solo per la sperimentazione ho collegato questa proprietà (con la sintassi di associazione sopra) a un DataGrid e ho verificato la proprietà DataGridColumnHelper.Header nella OnHeaderPropertyChanged metodo e il valore era corretto (e non è stata generata un'eccezione)

Sono consapevole che l'oggetto a cui è attaccato l'AttachedProperty deve essere un DependencyProperty . Guardando attraverso Reflector, DataGridColumn (da cui deriva DataGridTextColumn ) deriva da DependencyProperty .

Qualcuno può far luce su questo? Sto cercando di localizzare la nostra applicazione e sto riscontrando problemi con DataGrid. Sono sicuro di poterlo fare in code-behind, ma sto cercando di evitarlo.

È stato utile?

Soluzione

Chris, il problema è molto semplice, questo non funzionerà perché DataGridTextColumn è "rimosso". dall'albero visivo. Il tuo oggetto DataGridTextColumn è radicato nella raccolta Columns di DataGrid - vedi il riferimento indiretto. Pertanto, anche le proprietà associate non funzioneranno come previsto. Ora c'è un modo per far funzionare tutto questo usando qualcosa che sto chiamando Attached Bindings, vedi:

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

Ricorda solo di associare le proprietà di associazione usando qualcosa che è in VisualTree (quindi la griglia che tiene la colonna andrebbe bene.)

Spero che questo aiuti.

Altri suggerimenti

Prova a usarlo, supponendo che UserName sia una proprietà nel tuo modello

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

Non posso testare il tuo scenario, quindi il mio post è solo un'idea. Potrebbe funzionare, no.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top