Silverlight DataGrid coluna Propriedades anexadas
-
06-07-2019 - |
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.
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:
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.