Hallo Forum,
mit freundlicher Unterstützung von @Nofear23m bin ich bei meinem Projekt schon ein ganzen Stück weiter gekommen.
Leider weiss ich grad bei einem Punkt nicht weiter. Und zwar möchte ich, wenn auf einen bestimmten Button geklickt wird, die zugehörige Seite in dem TabControl anzeigen lassen.
Die XAML:
Spoiler anzeigen
TabControl ist ganz unten (Zeile 57). Dem TC hab ich einen fixen Namen zugewiesen, auf den ich zugreifen möchte.
Der Aufruf soll in meinem MainViewModel stattfinden, und zwar in der
Spoiler anzeigen
Wie bekomme ich jetzt Zugriff auf das TabControl? Wenn ich z.B. in o.g.
Dann habe ich versucht mir eine Instanz von MainWindow zu erzeugen, um auf tcBauteile zugreifen zu können:
Leider ändert es aber dann den Tab nicht. Was mach ich da falsch?
Das komplette Projekt ist als Anhang beigefügt.
Gruß Oli
mit freundlicher Unterstützung von @Nofear23m bin ich bei meinem Projekt schon ein ganzen Stück weiter gekommen.
Leider weiss ich grad bei einem Punkt nicht weiter. Und zwar möchte ich, wenn auf einen bestimmten Button geklickt wird, die zugehörige Seite in dem TabControl anzeigen lassen.
Die XAML:
XML-Quellcode
- <Window x:Class="MainWindow"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:local="clr-namespace:Checkbox_Test"
- xmlns:pkl="clr-namespace:Checkbox_Test.Produktklasse"
- mc:Ignorable="d"
- Title="ProFriCon" Height="450" Width="800">
- <StackPanel>
- <ItemsControl ItemsSource="{Binding Checkboxliste}">
- <ItemsControl.ItemTemplate>
- <DataTemplate>
- <CheckBox Content="{Binding neuesProdukt}" IsChecked="{Binding IsChecked}"/>
- </DataTemplate>
- </ItemsControl.ItemTemplate>
- </ItemsControl>
- <!--<ListBox>-->
- <ItemsControl ItemsSource="{Binding Produktliste}">
- <ItemsControl.ItemTemplate>
- <DataTemplate>
- <Border Padding="5" BorderBrush="Black" BorderThickness="1">
- <Grid Width="60">
- <Grid.RowDefinitions>
- <RowDefinition Height="40"/>
- <RowDefinition Height="*"/>
- </Grid.RowDefinitions>
- <Button Command="{Binding DataContext.Klick, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}"
- CommandParameter="{Binding}">
- <Image Source="{Binding Produktbild}" Stretch="Uniform"/>
- </Button>
- <StackPanel Grid.Row="1" Orientation="Horizontal">
- <Button x:Name="btnBackward" Width="30" Height="30" HorizontalAlignment="Left"
- Command="{Binding DataContext.Klick, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}"
- CommandParameter="{Binding}">
- <Image Source="Pictures/Zurueck_56x50.png" Stretch="UniformToFill" />
- </Button>
- <Button x:Name="btnForward" Width="30" Height="30" HorizontalAlignment="Right"
- Command="{Binding DataContext.Klick, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}"
- CommandParameter="{Binding}">
- <Image Source="Pictures/Vorwaerts_56x50.png"/>
- </Button>
- </StackPanel>
- </Grid>
- </Border>
- </DataTemplate>
- </ItemsControl.ItemTemplate>
- <ItemsControl.ItemsPanel>
- <ItemsPanelTemplate>
- <WrapPanel MaxWidth="750"/>
- </ItemsPanelTemplate>
- </ItemsControl.ItemsPanel>
- </ItemsControl>
- <!--</ListBox>-->
- <TabControl ItemsSource="{Binding Produktliste}" x:Name="tcBauteile">
- <TabControl.ContentTemplate>
- <DataTemplate>
- <ContentControl Content="{Binding}">
- <ContentControl.Resources>
- <DataTemplate DataType="{x:Type pkl:Standardbauteil}">
- <Image Source="{Binding Produktbild}" Width="42" Height="42" Stretch="UniformToFill"/>
- </DataTemplate>
- <DataTemplate DataType="{x:Type pkl:Bauteil_1}">
- <StackPanel>
- <Image Source="{Binding Produktbild}" Width="42" Height="42" Stretch="UniformToFill"/>
- <Button Content="{Binding Button}"/>
- </StackPanel>
- </DataTemplate>
- <DataTemplate DataType="{x:Type pkl:Bauteil_2}">
- <ListBox>
- <UniformGrid Columns="4">
- <Image Source="{Binding Produktbild}" Width="42" Height="42" Stretch="UniformToFill"/>
- <Button Content="{Binding Button}"/>
- <Button Content="{Binding Button}"/>
- <Button Content="{Binding Button}"/>
- </UniformGrid>
- </ListBox>
- </DataTemplate>
- </ContentControl.Resources>
- </ContentControl>
- </DataTemplate>
- </TabControl.ContentTemplate>
- </TabControl>
- </StackPanel>
- </Window>
TabControl ist ganz unten (Zeile 57). Dem TC hab ich einen fixen Namen zugewiesen, auf den ich zugreifen möchte.
Der Aufruf soll in meinem MainViewModel stattfinden, und zwar in der
Private Sub Klick_Execute(obj As Object)
(Zeile 36).
VB.NET-Quellcode
- Imports System.Collections.ObjectModel
- Imports Checkbox_Test.Produktklasse
- Public Class MainViewModel
- Public Sub New()
- With Checkboxliste
- .Add(New Produktlisteneintrag(New Standardbauteil("Prod1", "Pictures/Prod1.png")))
- .Add(New Produktlisteneintrag(New Bauteil_1("Prod2", "Pictures/Prod2.png", "Button Bauteil 1 Prod 2")))
- .Add(New Produktlisteneintrag(New Bauteil_1("Prod3", "Pictures/Prod3.png", "Button Bauteil 1 Prod 3")))
- .Add(New Produktlisteneintrag(New Bauteil_2("Prod4", "Pictures/Prod4.png", "Button Bauteil 2 Prod 4")))
- .Add(New Produktlisteneintrag(New Bauteil_2("Prod5", "Pictures/Prod5.png", "Button Bauteil 2 Prod 5")))
- .Add(New Produktlisteneintrag(New Standardbauteil("Prod6", "Pictures/Prod6.png")))
- .Add(New Produktlisteneintrag(New Standardbauteil("Prod7", "Pictures/Prod7.png")))
- .Add(New Produktlisteneintrag(New Bauteil_1("Prod8", "Pictures/Prod8.png", "Button Bauteil 1 Prod 8")))
- .Add(New Produktlisteneintrag(New Bauteil_1("Prod9", "Pictures/Prod9.png", "Button Bauteil 1 Prod 9")))
- .Add(New Produktlisteneintrag(New Bauteil_2("Prod10", "Pictures/Prod10.png", "Button Bauteil 2 Prod 10")))
- .Add(New Produktlisteneintrag(New Bauteil_2("Eagle", "Pictures/Eagle.png", "Button Bauteil 2 Eagle")))
- .Add(New Produktlisteneintrag(New Bauteil_1("Dog", "Pictures/Dog.png", "Button Bauteil 1 Dog")))
- .Add(New Produktlisteneintrag(New Bauteil_2("Cat", "Pictures/Cat.png", "Button Bauteil 2 Cat")))
- .Add(New Produktlisteneintrag(New Standardbauteil("Spider", "Pictures/Spider.png")))
- End With
- For Each eintrag As Produktlisteneintrag In Checkboxliste
- AddHandler eintrag.EintragCheckedChanged, AddressOf EintragCheckedChanged
- Next
- Klick = New RelayCommand(AddressOf Klick_Execute, AddressOf KlickCanExecute)
- End Sub
- Public Property Checkboxliste As ObservableCollection(Of Produktlisteneintrag) = New ObservableCollection(Of Produktlisteneintrag)
- Public Property Produktliste As ObservableCollection(Of Bauteil) = New ObservableCollection(Of Bauteil)
- Public Property Klick As ICommand
- Private Sub Klick_Execute(obj As Object)
- 'Mach was
- End Sub
- Private Function KlickCanExecute(obj As Object) As Boolean
- 'Return true wenn der Command ausgeführt werden darf oder false wenn nicht
- Return obj IsNot Nothing AndAlso TryCast(obj, Bauteil) IsNot Nothing
- End Function
- Private Sub EintragCheckedChanged(Haken As Boolean, neuesBild As Bauteil)
- If Haken Then
- Produktliste.Add(neuesBild)
- Else
- Produktliste.Remove(neuesBild)
- End If
- End Sub
- End Class
Wie bekomme ich jetzt Zugriff auf das TabControl? Wenn ich z.B. in o.g.
Klick_execute
den direkten Zugriff versuche mit MainWindow.tcBauteile.SelectedIndex = 0
dann kommt eine Fehlermeldung:Dann habe ich versucht mir eine Instanz von MainWindow zu erzeugen, um auf tcBauteile zugreifen zu können:
Leider ändert es aber dann den Tab nicht. Was mach ich da falsch?
Das komplette Projekt ist als Anhang beigefügt.
Gruß Oli