発電機のDataTemplateの背後にあるコードでバインディングのイベント
-
22-08-2019 - |
質問
シナリオで始めることができます:
私は、ユーザーコントロール内のItemsControlを持っています。このItemsControlに、私は分離コードで作成され、追加されたDataTemplate作成dynamiclyを持っています。分離コードでのDataTemplateを作成するための良い方法があるように思われないように私はプログラム的に文字列に私のDataTemplateのためのXAMLコードを生成し、その後XamlReaderを通じてそれのうちのDataTemplateオブジェクトを作成する必要がありました。
StringBuilder stringBuilder = new StringBuilder();
XmlWriter xmlWriter = XmlWriter.Create(stringBuilder);
... // use xmlWrite to generate desired xaml
// substring is use to cut out the xml declaration
DataTemplate template = (DataTemplate)XamlReader.Load(stringBuilder.ToString().Substring(39));
myItemsControl.ItemTemplate = template;
生成されたXAMLコードは次のようになりますし、実際に(期待通りのアイテムがレンダリングさ)が使用されます:
<DataTemplate xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Grid HorizontalAlignment="Stretch" Margin="0,0,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding b0}" Grid.Column="0" />
<TextBox Text="{Binding b1, Converter={StaticResource customConverter}}" HorizontalAlignment="Stretch" Grid.Column="1" LostFocus="TxtAttribute_LostFocus" />
<TextBox Text="{Binding b2, Converter={StaticResource customConverter}}" HorizontalAlignment="Stretch" Grid.Column="2" LostFocus="TxtAttribute_LostFocus" />
<TextBox Text="{Binding b3, Converter={StaticResource customConverter}}" HorizontalAlignment="Stretch" Grid.Column="3" LostFocus="TxtAttribute_LostFocus" IsReadOnly="True" />
</Grid>
の場合、あなたは疑問に思う:のxmlns属性は、コードに到達したときに例外を取得します他に、コントロールをレンダリングするXamlReaderによって必要とされている。
。私の問題:
今アイテムは、期待と、データが正しくバインドされている私のバインドされたデータを再フォーマットする必要がありcustomConverter、またLostFocusイベントでもないように見えながら、正しく適用されています。私はすべてのエラーメッセージや警告を得ることはありません、コンバータやイベントだけで呼び出されません。誰でもアイデアなぜ、どのように私はこの仕事を得ることができますか?
アップデートます:
私は、この問題を解決するために、異なるアプローチを試してみてポイントに達しました。 私の最後のテストでは、私はDataTemplateを直接コンバータを追加しようとしましたが、私は運がなかったです。生成されたコードは次のようになります:
<DataTemplate xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Conv="clr-namespace:my.Namespace" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Grid HorizontalAlignment="Stretch" Margin="0,0,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="80" />
<ColumnDefinition Width="80" />
<ColumnDefinition Width="80" />
</Grid.ColumnDefinitions>
<Grid.Resources>
<Conv:DecimalConverter x:Name="cnvDecimalConverter" />
</Grid.Resources>
<TextBlock Text="{Binding b0}" Grid.Column="0" />
<TextBox Text="{Binding b1, Converter={StaticResource cnvItemsDecimalConverter}}" HorizontalAlignment="Stretch" Grid.Column="1" LostFocus="TxtAttribute_LostFocus" />
<TextBox Text="{Binding b2, Converter={StaticResource cnvItemsDecimalConverter}}" HorizontalAlignment="Stretch" Grid.Column="2" LostFocus="TxtAttribute_LostFocus" />
<TextBox Text="{Binding b3, Converter={StaticResource cnvItemsDecimalConverter}}" HorizontalAlignment="Stretch" Grid.Column="3" LostFocus="TxtAttribute_LostFocus" IsReadOnly="True" />
</Grid>
</DataTemplate>
任意のアイデア?
アップデート2:
私はちょうどXamlReader.Loadを(見つけたように)だけのイベントをフックすることができません。参照してください。
のSilverlightのフォーラムでこのスレッドコンバータは動作するはずです、私はまだ私は見ていない名前空間の問題のいくつかの種類を持っていると思います。私は一種の私の「シンプル」のItemsControlのアプローチとオプションの外だので、私はそれが私のニーズに到達するために別の方法を探すための時間だと思います。
解決
ただ、状況をクリアするには:XAMLの文字列を生成してイベントとダイナミックDataTemplatesを生成し、これからの制御を抽出することはできません。イベントとXAMLコードを解析するための唯一のオプションが機能するためにURIを必要Application.LoadComponentている。
私は「動的」動作を作成するために、ネストされたItemControlsを使用して終了します。