Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[WPF/XAML] Control Collection?

Pagina: 1
Acties:

  • creator1988
  • Registratie: Januari 2007
  • Laatst online: 18-11 22:35
We hebben een applicatie draaien die een XAML frontend heeft (WPF applicatie in de browser), en die wordt aangestuurd middels een webservice. Nu probeer ik een formuliertje op te bouwen, en die naderhand weer te verwerken. Nu is dit in principe niet zo'n probleem en ik heb dit gefabriceerd:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    <Page.Resources>
        <DataTemplate x:Key="ItemTemplate">
                <Grid Width="Auto" Height="Auto">


                <Grid.RowDefinitions>
                    <RowDefinition></RowDefinition>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition></ColumnDefinition>
                    <ColumnDefinition></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <TextBlock VerticalAlignment="Center" x:Name="desc" Text="{Binding Name}" Grid.Row="0" Grid.Column="0"></TextBlock> 
                <TextBox 
                VerticalAlignment="Center" x:Name="val" Grid.Row="0" Grid.Column="1" Text="{Binding Value}"></TextBox>

            </Grid>
        </DataTemplate>

    </Page.Resources>


en

code:
1
2
3
4
5
6
7
8
        <ScrollViewer x:Name="ContentScrollViewer" Width="Auto" Height="Auto" VerticalScrollBarVisibility="Auto" Grid.Row="2">
            <StackPanel x:Name="ReportStackPanel" Style="{StaticResource PageStackPanel}">

              <ItemsControl x:Name="ReportGroupsItemsContol" ItemsSource="{Binding}" ItemTemplate="{StaticResource ItemTemplate}" />            

            </StackPanel>
            
        </ScrollViewer>


ik bind als volgt:
code:
1
ReportStackPanel.DataContext = dynamicReportGroup.Properties;


DynamicReportGroup.Properties is een List<Property> en heeft de volgende properties:
- Name
- Value
- ContentType

Nou het werkt dus prima, ik krijg een tabelletje met links de name's en rechts tekstboxjes. De catch is, afhankelijk van de ContentType wil ik een object laten zien. Bijvoorbeeld ContentType=ContentType.String -> een tekstvak; ContentType=ContentType.Date -> een datepicker, etc. etc.

Nu kan ik dat in ASP.Net doen door bijvoorbeeld de Controlcollection in een repeater te modificeren, maar hoe kan ik het in WPF :(

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Je kunt gebruik maken van een DataTemplateSelector kun je dmv een stukje code kiezen welk DataTemplate gebruikt gaat worden.
Voorbeeldje:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class TestSelector : DataTemplateSelector
{
    public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container)
    {
        if (item != null && item is Test)
        {
            Test testitem = item as Test;
            Window window = Application.Current.MainWindow;

            if (testitem.Value.GetType() == typeof(String))
                return
                    window.FindResource("templateString") as DataTemplate;
            else
                return
                    window.FindResource("templateDateTime") as DataTemplate;
        }

        return null;
    }
}


XAML ziet er als volgt uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<Window x:Class="ControlTypeBinding.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:foo="clr-namespace:ControlTypeBinding"
    Title="Window1" Height="300" Width="350">
    <Window.Resources>
        <foo:TestSelector x:Name="testSelector" x:Key="testSelector" />
        <DataTemplate x:Key="templateString" DataType="System.String">
                <TextBox Text="{Binding Path=Value, Mode=OneWay}" />
        </DataTemplate>
        <DataTemplate x:Key="templateDateTime" DataType="System.DateTime">
                <Label Content="{Binding Path=Value, Mode=OneWay}" />
        </DataTemplate>
    </Window.Resources>
    <StackPanel Name="stackOne">
        <ItemsControl Name="items1"
              ItemsSource="{Binding}"
              ItemTemplateSelector="{StaticResource testSelector}">
        </ItemsControl>
    </StackPanel>
</Window>

Nu met Land Rover Series 3 en Defender 90