Silverlight DataGrid列の添付プロパティ
-
06-07-2019 - |
質問
Silverlight 3.0内で DataGridColumn
の AttachedProperty
を作成しようとしていますが、いくつかの問題があります。
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);
}
}
ご覧のとおり、非常にシンプルであるため、DataGridColumnクラスのHeaderプロパティをバインドできないという制限を克服しようとしています。
このXAMLは期待どおりに動作します...
<Controls:DataGridTextColumn Binding="{Binding OwnerName}"
HeaderStyle="{StaticResource DataGridColumnHeaderStyle}"
Behaviors:DataGridColumnHelper.Header="User Name"/>
ただし、このXAMLはエラーをスローします...(具体的には{System.Windows.Markup.XamlParseException:AG_E_PARSER_PROPERTY_NOT_FOUND [Line:224 Position:112] System.Windows.Application.LoadComponent(オブジェクトコンポーネント、Uri resourceLocator)で ....})
<Controls:DataGridTextColumn Binding="{Binding OwnerName}"
HeaderStyle="{StaticResource DataGridColumnHeaderStyle}"
Behaviors:DataGridColumnHelper.Header="{Binding Resources.UserNameListViewHeading, Source={StaticResource Labels}}"/>
実験のために、このプロパティ(上記のバインド構文を使用)を DataGrid
に添付し、 OnHeaderPropertyChanged
DataGridColumnHelper.Header プロパティを確認しました>メソッドと値が正しい(例外がスローされなかった)
AttachedPropertyがアタッチされるオブジェクトは DependencyProperty
でなければならないことを理解しています。 Reflectorを見ると、 DataGridColumn
( DataGridTextColumn
の派生元)は DependencyProperty
から派生しています。
誰かがこれについていくつかの光を当ててください。アプリケーションをローカライズしようとしていますが、DataGridで問題が発生しています。コードビハインドでこれを実行できると確信していますが、それを回避しようとしています。
解決
Chris、問題は非常に簡単です。DataGridTextColumnが「切り離された」ため、これは機能しません。ビジュアルツリーから。 DataGridTextColumnオブジェクトは、DataGridのColumnsコレクションに根ざしています-インダイレクションを参照してください。したがって、添付プロパティでさえ期待どおりに機能しません。今、私がAttached Bindingsと呼んでいるものを使用して、このすべてを機能させる方法があります。参照:
http://www.orktane.com/Blog/post/2009/09/29/Introducing-nRouteToolkit-for-Silverlight-(Part-I).aspx
VisualTreeにあるものを使用してバインディングプロパティをアタッチすることを忘れないでください(したがって、列を保持しているグリッドは問題なく動作します)。
これがお役に立てば幸いです。
他のヒント
これを使用して、UserNameがビューモデルのプロパティであると想定してください
<Controls:DataGridTextColumn Binding="{Binding OwnerName}"
HeaderStyle="{StaticResource DataGridColumnHeaderStyle}"
Behaviors:DataGridColumnHelper.Header="{Binding UserName}"/>
あなたのシナリオをテストすることはできませんので、私の投稿は単なるアイデアです。動作するかもしれませんが、動作しないかもしれません。