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
Hallo Taladan,
guckst du hier: DataTemplate
Das funktioniert so ziemlich gleich wie es dir damals WinSharp93 erklärt hat
Gruss
Michael
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
Hat sich erledigt. Hab bei der Datenbindung nicht auf groß und kleinschreibung geachtet.
ElementName=Tv, <--- da war der Fehler
Gruß dat Tala