簡體   English   中英

生成的DataTemplate背后的代碼中的EventBinding

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM