[英]EventBinding in a codebehind generated DataTemplate
讓我們從場景開始:
我在UserControl中有一個ItemsControl。 在這個ItemsControl中,我有一個動態創建的DataTemplate,它是在代碼隱藏中創建和添加的。 由於似乎沒有一種在代碼隱藏中創建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>
如果您想知道:XamlReader需要xmlns屬性來呈現控件,否則在到達代碼時會得到異常。
我的問題:
現在,盡管項目看起來像預期的一樣,並且數據已正確綁定,但應重新格式化綁定數據的customConverter或LostFocus事件均未正確應用。 我沒有收到任何錯誤消息或警告,只是沒有調用轉換器和事件。 任何人都知道為什么以及如何才能使它正常工作嗎?
更新:
我到達了必須解決此問題或嘗試其他方法的地步。 在上一次測試中,我嘗試將Converter直接添加到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代碼的唯一選項是通過Application.LoadComponent,它需要URI才能起作用。
我最終使用嵌套的ItemControls來創建我的“動態”行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.