Laden...

ContentControl-Style / Template abhängig vom Contentinhaltstyp machen

Erstellt von Taladan vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.001 Views
Taladan Themenstarter:in
582 Beiträge seit 2008
vor 14 Jahren
ContentControl-Style / Template abhängig vom Contentinhaltstyp machen

Hallo,

ich wollte ein ContentControl dazu nutzen, um ein Detail-Content abhängig vom SelectedItem einer Listview an zu zeigen, die SelectedItems können durchaus unterschiedlichen Typs sein. Selbsterstellte Typen wie Beispielsweise ArchivItem oder PictureItem.

Wie kann ich nun WPF beibringen, das Richtige Template automatisch aus zu wählen?


<Style x:Key="ContentCtrl" TargetType="{x:Type ContentControl}">
    <Style.Triggers>
                <DataTrigger Binding="{Binding Content}" Value="{x:Type IK:ArchivItem}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type ContentControl}">
                                <Label>ArchivItem</Label>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding Content}" Value="{x:Type IK:PictureItem}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type ContentControl}">
                                <Label>PictureItem</Label>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
 </Style>

<ContentControl Name="ccDetails" Style="{StaticResource ContentCtrl}"  Grid.Column="1" Grid.ColumnSpan="3"  Grid.Row="4" Grid.RowSpan="2" 
       Content="{Binding ElementName=Tv, Path=SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"          />

Bei diesen Versuch bekomme ich die Fehlermeldung "Sowohl "Binding" als auch "Value" müssen für "DataTrigger" angegeben werden. "

Gruß dat Tala

3.430 Beiträge seit 2007
vor 14 Jahren

Hallo Taladan,

guckst du hier: DataTemplate
Das funktioniert so ziemlich gleich wie es dir damals WinSharp93 erklärt hat

Gruss
Michael

Taladan Themenstarter:in
582 Beiträge seit 2008
vor 14 Jahren

Mag sein. Aber irgendwie funktioniert das nicht. Das Template wird aus irgend einen Grunde nicht ausgewählt.

        
 <Page.Resources>

        <DataTemplate x:Key="ArchivDokument" DataType="{x:Type IK:ArchivItem}">
            <Border>
                <Border.DataContext>
                    <Binding ElementName="tv" Path="SelectedItem" />
                </Border.DataContext>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    <Label Grid.Column="0" Grid.Row="0">Dokument</Label>
                    <Label Grid.Column="0" Grid.Row="1">Titel</Label>
                    <Label Grid.Column="0" Grid.Row="2">Schlagworte</Label>
                    <Label Grid.Column="0" Grid.Row="3">Bemerkung</Label>

                    <Button Grid.Column="3" Grid.Row="0" Name="btnOpenDokument" Click="btnOpenDokument_Click">...</Button>

                    <TextBox Grid.Column="1" Grid.Row="0" Name="tbDokumentPfad" 
                                         Text="{Binding Path=FileLocation, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" TextChanged="tbDokumentPfad_TextChanged" />

                    <TextBox Grid.Column="1" Grid.Row="1" Name="tbDocumentTitel" Grid.ColumnSpan="2" 
                                         Text="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                                         />

                    <TextBox Grid.Column="1" Grid.Row="2" Name="tbDocumentSchlagworte" Grid.ColumnSpan="2" 
                                         Text="{Binding Path=KeyWords, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                         />

                    <TextBox Grid.Column="1" Grid.Row="3" Name="tbDocumentBemerkung" Grid.ColumnSpan="2" 
                                         Text="{Binding Path=Comment, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                         />

                    <Label Grid.Row="4" MouseDown="lvDocumentKategorien_MouseDown">Kategorien</Label>
                    <TextBox Grid.Column="1" Grid.Row="4" Name="tbDocumentCategory" Grid.ColumnSpan="2" 
                                         Text="{Binding Path=Category, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                         />

                </Grid>
            </Border>
        </DataTemplate>



        <IK:ArchivTemplateSelector x:Key="TemplateSelector" ArchivTemplateKey="ArchivDokument" />
 <IK:ExtendetListView x:Name="tv"    />
<ContentControl Name="ccDetails" Grid.Column="1" Grid.ColumnSpan="3"  Grid.Row="4" Grid.RowSpan="2" ContentTemplateSelector="{StaticResource TemplateSelector}"
             Content="{Binding ElementName=Tv, Path=SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"     />


  public sealed class ArchivTemplateSelector : DataTemplateSelector
    {
        public object ArchivTemplateKey
        {
            get;
            set;
        }
        public object ImageTemplateKey
        {
            get;
            set;
        }

        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            FrameworkElement fe = container as FrameworkElement;
            if ((item != null) && (item is ArchivItem))
            {
                return fe.FindResource(ArchivTemplateKey) as DataTemplate;
            }
            return base.SelectTemplate(item, container);

        }
    }

Gruß dat Tala

Taladan Themenstarter:in
582 Beiträge seit 2008
vor 14 Jahren

Hat sich erledigt. Hab bei der Datenbindung nicht auf groß und kleinschreibung geachtet.

ElementName=Tv, <--- da war der Fehler

Gruß dat Tala