Proprietà associate alla colonna Silverlight DataGrid
-
06-07-2019 - |
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.
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:
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.