Nochmals finden eines Elements in einem DataTemplate

20/04/2008 - 10:29 von Jürgen Himmel | Report spam
Hallo,

da ich damit einfach nicht mehr weiterkomme bitte ich nochmals um
Mithilfe bei meinem Problem.

Ich habe hier das folgende DataTemplate:

<Window.Resources>
<DataTemplate x:Key="TabItemTemplate">
<Grid Background="AliceBlue">
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" BorderThickness="1"
BorderBrush="Blue">
<StackPanel Grid.Column="0">
<TextBlock TextAlignment="Center"
FontSize="30">XML-Eingabe</TextBlock>
<Label>Ausgewàhlte XML-, DTD- oder
Schema-Datei:</Label>
<Grid>
<ComboBox Name="Verzeichniswahl"
IsSynchronizedWithCurrentItem="True" HorizontalAlignment="Center"
MaxWidth="400" Width="400"
ContextMenuOpening="Verzeichniswahl_ContextMenuOpening">
<ComboBoxItem
Name="Verzeichniswahlelement">
<ComboBoxItem.Content>
<Binding XPath="Name"/>
</ComboBoxItem.Content>
</ComboBoxItem>
</ComboBox>
</Grid>
noch weitere Grid-Elemente des DataTemplates

Dieses DataTemplate ruft über ein entsprechendes Event dies auf:

<TabControl Grid.Row="2" Name="XMLTab" Height="Auto"
Background="AliceBlue" ItemTemplate="{StaticResource TabItemTemplate}">
</TabControl>

Was auch genauso funktioniert. Das TabItem wird aufgerufen und angezeigt.

Was ich aber nicht hinbekomme ist der Aufruf eines Elements innerhalb
des DataTemplates. Bisher habe ich es so versucht oder so àhnlich:

private void Verzeichniswahl_ContextMenuOpening(object sender,
ContextMenuEventArgs e)
{
ComboBox Verzeichniswahl = new ComboBox();
ComboBoxItem Verzeichniswahlelement =
(ComboBoxItem)(Verzeichniswahl.ItemContainerGenerator.ContainerFromItem(Verzeichniswahl.Items.CurrentItem));

ContentPresenter myContentPresenter =
FindVisualChild<ContentPresenter>(Verzeichniswahlelement);
DataTemplate TabItemTemplate =
myContentPresenter.ContentTemplate;

TabItemTemplate.FindName("Verzeichniswahlelement",
myContentPresenter);

Verzeichniswahlelement.Content = "Test";
Verzeichniswahl.Items.Add(Verzeichniswahlelement);
}

//Definition von FindVisualChild
private childItem FindVisualChild<childItem>(DependencyObject obj)
where childItem : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj);
i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is childItem)
return (childItem)child;
else
{
childItem childOfChild =
FindVisualChild<childItem>(child);
if (childOfChild != null)
return childOfChild;
}
}
return null;
}

Normalerweise müsste doch der Eintrag "Test" als Eintrag im ComboBoxItem
erscheinen, aber es passiert nichts. Auch erscheinen keine
Fehlermeldungen des Compilers.

Die Seite

http://msdn2.microsoft.com/en-us/li...13579.aspx

hat mir leider nicht viel geholfen.

Wer kann mir dabei irgendwie weiterhelfen. Irgendwie stehe ich wohl auf
dem Schlauch!?

Gruß
Jürgen
 

Lesen sie die antworten

#1 Maximilian Hänel
20/04/2008 - 17:37 | Warnen spam
Hi Jürgen,

Was ich aber nicht hinbekomme ist der Aufruf eines Elements innerhalb
des DataTemplates. Bisher habe ich es so versucht oder so àhnlich:



[Snip]

So etwa:

private void Verzeichniswahl_ContextMenuOpening(object sender,
ContextMenuEventArgs e)
{
var cb = sender as ComboBox;
var cbItem =
(ComboBoxItem)(cb.ItemContainerGenerator.ContainerFromItem(
cb.Items.CurrentItem)
);

if(null!=cbItem)
{
cbItem.Content="Test";
}
}

btw: Du solltest unter WPF möglichst keinen Code schreiben, der vom
Visual Tree eines Controls abhàngt, denn damit machst du dir nur das
Prinzip der "lookless controls" kaputt.

hth

Max

Ähnliche fragen