Hallo zusammen,
ich komm grad wieder nicht weiter bei meinem Projekt. Ich habe meine Anwendung erweitert, so dass ein User ein paar Eingaben tätigen kann. Das habe ich wie üblich über eine ObservableCollection gelöst. Funktioniert auch.
Spoiler anzeigen
Die Klasse Eingaben_MainView sieht so aus:
Spoiler anzeigen
Im Setter von EingabeText gebe ich immer Rückmeldung, wenn sich der Wert ändert. Passt und funktioniert. Jetzt soll aber der aktuelle Text aus Eingabe "A" auch in einem Textblock angezeigt werden.
Hier die XAML:
Spoiler anzeigen
In Zeile 14 - 23 wird die Eingabeliste erstellt. In Zeile 36 erstellt ich einen Button mit einem Bild und einem TextBlock. Wie bekomme ich jetzt den Wert aus Eingabe "A" in den TextBlock?
Über Binding, klar! Wenn ich aber wie gezeigt auf EingabeText binde, kommt der Fehler:
Spoiler anzeigen
Das heißt er sucht in MainViewModel nach der Property, ich will aber dass die gleiche Property verwendet wird, wie für das Eingabefeld. Geht das? Wenn ja wie? Die Tutorials habe ich mir wiederholt angesehen, konnte das aber nicht umsetzen .
Danke im Voraus!
Gruß Oli
ich komm grad wieder nicht weiter bei meinem Projekt. Ich habe meine Anwendung erweitert, so dass ein User ein paar Eingaben tätigen kann. Das habe ich wie üblich über eine ObservableCollection gelöst. Funktioniert auch.
VB.NET-Quellcode
- Public Property Eingabeliste As ObservableCollection(Of Eingaben_MainView) = New ObservableCollection(Of Eingaben_MainView)
- With Eingabeliste
- .Add(New Eingaben_MainView("A", ""))
- .Add(New Eingaben_MainView("B", ""))
- .Add(New Eingaben_MainView("C", ""))
- .Add(New Eingaben_MainView("D", ""))
- .Add(New Eingaben_MainView("E", ""))
- End With
Die Klasse Eingaben_MainView sieht so aus:
VB.NET-Quellcode
- Namespace Eingabe
- Public Class Eingaben_MainView
- Public _EingabeContent As String
- Public Property EingabeContent As String
- Get
- EingabeContent = _EingabeContent
- End Get
- Set(value As String)
- _EingabeContent = value
- End Set
- End Property
- Public _EingabeText As String
- Public Property EingabeText As String
- Get
- EingabeText = _EingabeText
- End Get
- Set(value As String)
- _EingabeText = value
- If EingabeContent = "A" AndAlso EingabeText <> "" Then
- MessageBox.Show("Text geändert")
- End If
- End Set
- End Property
- Public Sub New(LabelContent As String, TextBoxText As String)
- EingabeContent = LabelContent
- EingabeText = TextBoxText
- End Sub
- End Class
- End Namespace
Im Setter von EingabeText gebe ich immer Rückmeldung, wenn sich der Wert ändert. Passt und funktioniert. Jetzt soll aber der aktuelle Text aus Eingabe "A" auch in einem Textblock angezeigt werden.
Hier 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="800" Width="1200">
- <StackPanel>
- <StackPanel Orientation="Horizontal" Margin="10">
- <ItemsControl ItemsSource="{Binding Eingabeliste}" Focusable="False">
- <ItemsControl.ItemTemplate>
- <DataTemplate>
- <WrapPanel Width="300" Margin="0,2">
- <Label Content="{Binding EingabeContent}" Width="155" HorizontalContentAlignment="Right" />
- <TextBox Text="{Binding EingabeText, UpdateSourceTrigger=PropertyChanged}" Width="140" MinHeight="20"/>
- </WrapPanel>
- </DataTemplate>
- </ItemsControl.ItemTemplate>
- </ItemsControl>
- <GroupBox Header="Produktauswahl" Margin="25,0,0,0" Padding="5" >
- <ItemsControl ItemsSource="{Binding Checkboxliste}" HorizontalAlignment="Right" Margin="10,0" Focusable="False">
- <ItemsControl.ItemTemplate>
- <DataTemplate>
- <CheckBox Content="{Binding neuesProdukt}" IsChecked="{Binding IsChecked}" Margin="2" FontSize="14"/>
- </DataTemplate>
- </ItemsControl.ItemTemplate>
- </ItemsControl>
- </GroupBox >
- </StackPanel>
- <ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Disabled" >
- <StackPanel Orientation="Horizontal" Margin="0,25,0,0">
- <Button Height="105" Width="80" Margin="5" VerticalAlignment="Top">
- <StackPanel >
- <Image Source="Pictures/Start.png"/>
- <TextBlock Text="{Binding EingabeText}"/>
- </StackPanel>
- </Button>
- <ItemsControl ItemsSource="{Binding Produktliste}" Margin="5">
- <ItemsControl.ItemTemplate>
- <DataTemplate>
- <Border Padding="5" BorderBrush="Black" BorderThickness="1" CornerRadius="5" Margin="5,0">
- <Grid Width="80">
- <Grid.RowDefinitions>
- <RowDefinition Height="60"/>
- <RowDefinition Height="*"/>
- </Grid.RowDefinitions>
- <Button Command="{Binding DataContext.Klick, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}"
- CommandParameter="{Binding}" HorizontalAlignment="Center" Width="80">
- <Image Source="{Binding Produktbild}" Stretch="Uniform"/>
- </Button>
- <StackPanel Grid.Row="1" Orientation="Horizontal" Margin="0,5,0,0">
- <Button Name="btnBackward" Width="30" Height="30"
- Command="{Binding DataContext.Back, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}"
- CommandParameter="{Binding}">
- <Image Stretch="UniformToFill" Source="{Binding Zurueck}" />
- </Button>
- <Button Name="btnForward" Width="30" Height="30"
- Command="{Binding DataContext.Forward, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}"
- CommandParameter="{Binding}" Margin="20,0,0,0">
- <Image Source="{Binding Vor}"/>
- </Button>
- </StackPanel>
- </Grid>
- </Border>
- </DataTemplate>
- </ItemsControl.ItemTemplate>
- <ItemsControl.ItemsPanel>
- <ItemsPanelTemplate>
- <WrapPanel HorizontalAlignment="Left"/>
- </ItemsPanelTemplate>
- </ItemsControl.ItemsPanel>
- </ItemsControl>
- </StackPanel>
- </ScrollViewer>
- <TabControl ItemsSource="{Binding Produktliste}" SelectedItem="{Binding SelectedProdukt}">
- <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>
In Zeile 14 - 23 wird die Eingabeliste erstellt. In Zeile 36 erstellt ich einen Button mit einem Bild und einem TextBlock. Wie bekomme ich jetzt den Wert aus Eingabe "A" in den TextBlock?
Über Binding, klar! Wenn ich aber wie gezeigt auf EingabeText binde, kommt der Fehler:
VB.NET-Quellcode
- System.Windows.Data Error: 40 : BindingExpression path error: 'EingabeText' property not found on 'object' ''MainViewModel' (HashCode=8622890)'. BindingExpression:Path=EingabeText; DataItem='MainViewModel' (HashCode=8622890); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
Das heißt er sucht in MainViewModel nach der Property, ich will aber dass die gleiche Property verwendet wird, wie für das Eingabefeld. Geht das? Wenn ja wie? Die Tutorials habe ich mir wiederholt angesehen, konnte das aber nicht umsetzen .
Danke im Voraus!
Gruß Oli