コードで Silverlight DataTemplate を作成する
-
09-06-2019 - |
質問
コードで Silverlight データ テンプレートを作成するにはどうすればよいですか?WPF の例はたくさん見てきましたが、Silverlight の例は何もありませんでした。
編集:以下のサンティアゴからの回答に基づいて、現在これを使用しているコードは次のとおりです。
public DataTemplate Create(Type type)
{
return (DataTemplate)XamlReader.Load(
@"<DataTemplate
xmlns=""http://schemas.microsoft.com/client/2007"">
<" + type.Name + @" Text=""{Binding " + ShowColumn + @"}""/>
</DataTemplate>"
);
}
これは非常にうまく機能し、その場でバインディングを変更することができます。
解決
プログラムで作成することはできませんが、次のようなコード内の XAML 文字列から読み込むことができます。
public static DataTemplate Create(Type type)
{
return (DataTemplate) XamlReader.Load(
@"<DataTemplate
xmlns=""http://schemas.microsoft.com/client/2007"">
<" + type.Name + @"/>
</DataTemplate>"
);
}
上記のスニペットは、単一のコントロールを含むデータ テンプレートを作成します。これは、必要なコンテンツを含むユーザー コントロールである可能性があります。
他のヒント
このコードにはいくつかの問題があり、要素が見つかりませんという例外が発生しました。参考までに、DataTemplate に名前空間を含める必要があるということでした。
private DataTemplate Create(Type type)
{
string xaml = @"<DataTemplate
xmlns=""http://schemas.microsoft.com/client/2007""
xmlns:controls=""clr-namespace:" + type.Namespace + @";assembly=" + type.Namespace + @""">
<controls:" + type.Name + @"/></DataTemplate>";
return (DataTemplate)XamlReader.Load(xaml);
}
はい、Silverligt 4 は WPF の現在のバージョンよりも古いです。テンプレートをリソースとして追加するとき、つまり私がしたように、私はapplication.xamlのsuresedictionary間のsecortrolテンプレートを追加しました。XAML では、タグが IDictionary を実装している場合、x:Key 属性を使用できます。そんなふうに
<ResourceDictionary>
<DataTemplate x:Key="TextBoxEditTemplate">
<Some user control x:Name="myOwnControl" />
</DataTemplate>
</ResourceDictionary>
わかりました!次のようにコーディングすると、テンプレートにアクセスできます。 Application.Current.resources["TextBoxEditTemplate"]一方、このテンプレートのメンバーを検索する一部のメソッドは機能しません。この DataTemplate は IDictionary を実装していないため、この dataTemplate の項目に x:Key 属性を割り当てることはできません。例では myOwnControl として使用します。
xaml を使用しない場合、現在の Silverlight には、完全に動的な分離コード DataTemplate の作成に関していくつかの制限があります。WPF でも動作します。
とにかく、この時点での最善の解決策は、 datatemplate の XAML スクリプトを作成することです。DataTemplate スクリプトでいくつかの値要素を割り当てることができます。独自に作成したユーザーコントロールには、DependencyObjectProperty を持ついくつかのプロパティがあります...
最後に、オブジェクトに継承がない場合、つまり継承できる MyControl:UserControl ではありません MyObject:DependencyObject この方法では、Application.Current.Resources.FirstChilderen... のように呼び出してオブジェクトにアクセスできます。
FindName は WPF でのみ機能します
データ テンプレートを作成するためのコンテンツを定義する XAML の使用法は、設定可能なプロパティとして公開されません。これは、DataTemplate オブジェクト要素の XAML 処理に組み込まれた特別な動作です。