Domanda

Iniziamo con lo scenario:

Ho un ItemsControl all'interno di un UserControl. In questo ItemsControl ho un dynamicly creato DataTemplate che viene creato e aggiunto in codebehind. Poiché non sembra essere un bel modo per creare un DataTemplate in codebehind ho dovuto generare a livello di codice il codice XAML per il mio DataTemplate in una stringa e quindi creare un oggetto DataTemplate fuori di esso attraverso XamlReader:

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;

Il codice XAML generato assomiglia a questo ed è effettivamente utilizzato (le voci vengono resi come previsto):

<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>

Nel caso in cui si chiedono: attributo è necessario per il XamlReader xmlns per il rendering del controllo, altrimenti si otterrà un'eccezione quando si raggiunge il codice

.

Il mio problema:

ora, mentre le voci sembrano previsto ei dati vengono correttamente vincolato né mia customConverter che dovrebbe riformattare i dati associati, né l'evento LostFocus vengono applicati correttamente. Non capisco eventuali messaggi di errore o avvisi, convertitore ed evento semplicemente non vengono chiamati. Chiunque un'idea perché e come posso ottenere questo lavoro?

Aggiornamento:

Ho raggiunto un punto in cui devo risolvere questo problema o per provare un approccio diverso. Nei miei ultimi test ho provato ad aggiungere il convertitore direttamente nel DataTemplate ma non ho avuto fortuna. Il codice generato appare come segue:

<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>

Tutte le idee?

Aggiornamento 2:

Come ho appena scoperto XamlReader.Load () solo che non è in grado di collegare gli eventi. Vedere questa discussione nei forum Silverlight

I convertitori dovrebbero funzionare, credo di avere ancora qualche tipo di problema dello spazio dei nomi non vedo. Sono un po 'fuori di opzioni con il mio approccio "semplice" ItemsControl quindi penso che è il momento di cercare un altro metodo per raggiungere i miei bisogni.

È stato utile?

Soluzione

Proprio per chiarire la situazione: non è possibile generare DataTemplates dinamici con gli eventi attraverso la generazione di una stringa XAML ed estrarre il controllo da questo. L'unica opzione per analizzare il codice XAML con gli eventi è attraverso Application.LoadComponent che ha bisogno di un URI di lavorare.

Ho finito per usare ItemControls annidati per creare il mio comportamento "dinamico".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top