C sharp WPF MVVM Visibility Binding funktioniert nicht bei UI
Hallo @ All!
Ich habe eine Frage zum Binding eines UI (UserControl) via MVVM und hoffe auf eure Hilfe!
In folgendem Beispiel habe ich ein Window mit 2 Buttons und 2 UIs. Die Buttons sollen nur jeweils ein UI visible und das andere hidden schalten.
Doch will es nur via Binding auf das VisibleProperty funktionieren und ich verstehe nicht ganz warum. Wenn mir also jemand von Euch sagen kann wo der Fehler liegt wäre ich froh.
MainWindow XAML
MainWindow.cs
UserControl A ( B ist genau gleich aufgebaut)
UserControl A.cs
Nochmals Danke!
Gruß Mayho
EDIT:
Problem gelöst!!
die Properties müssen natürlich im jeweiligen UI sein und das Binding erfolgt ebenfalls im UI.XAML. Damit die Properties von Außen ansprechbar sind habe ich sie als Static definiert.
Nun rennt das ganze z.B. so:
Ich habe eine Frage zum Binding eines UI (UserControl) via MVVM und hoffe auf eure Hilfe!
In folgendem Beispiel habe ich ein Window mit 2 Buttons und 2 UIs. Die Buttons sollen nur jeweils ein UI visible und das andere hidden schalten.
Doch will es nur via Binding auf das VisibleProperty funktionieren und ich verstehe nicht ganz warum. Wenn mir also jemand von Euch sagen kann wo der Fehler liegt wäre ich froh.
MainWindow XAML
<Window
x:Class="Switch_Window_Test2.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:local="clr-namespace:Switch_Window_Test2"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Height="400"
Width="400"
mc:Ignorable="d">
<Grid>
<Button
Width="75"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Click="Button_ClickB"
Content="B" Height="20" Margin="221,326,0,0" />
<Button
Width="75"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Click="Button_ClickA"
Content="A" Height="20" Margin="307,326,0,0" />
<local:A_UI
x:Name="UI_A"
Height="200"
Width="200"
Visibility="{Binding UiA_Visibility}" Margin="192,121,0,48" />
<local:B_UI
x:Name="UI_B"
Height="200"
Width="200"
Visibility="{Binding UiB_Visibility}" Margin="0,0,192,169" />
</Grid>
</Window>
MainWindow.cs
namespace Switch_Window_Test2
{
/// <summary>
/// Interaktionslogik für MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void ChangeProperty([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
private static Visibility _UiA_Visibility = Visibility.Hidden;
public Visibility UiA_Visibility
{
get { return _UiA_Visibility; }
set
{
// das funktionert wie erwartet und so habe ich es bisher gemacht:
//UI_A.Visibility = value;
//das funktioniert nicht:
_UiA_Visibility = value;
ChangeProperty();
}
}
private static Visibility _UiB_Visibility = Visibility.Hidden;
public Visibility UiB_Visibility
{
get { return _UiB_Visibility; }
set
{
// das funktionert wie erwartet und so habe ich es bisher gemacht:
//UI_B.Visibility = value;
//das funktioniert nicht:
_UiB_Visibility = value;
ChangeProperty();
}
}
private void Button_ClickA(object sender, RoutedEventArgs e)
{
UiA_Visibility = Visibility.Visible;
UiB_Visibility = Visibility.Hidden;
}
private void Button_ClickB(object sender, RoutedEventArgs e)
{
UiA_Visibility = Visibility.Hidden;
UiB_Visibility = Visibility.Visible;
}
}
}
UserControl A ( B ist genau gleich aufgebaut)
<UserControl
x:Class="Switch_Window_Test2.A_UI"
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:local="clr-namespace:Switch_Window_Test2"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:DesignHeight="300"
d:DesignWidth="300"
mc:Ignorable="d">
<Grid>
<TextBlock
Margin="108,86,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
FontSize="50"
Text="A"
TextWrapping="Wrap" />
</Grid>
</UserControl>
UserControl A.cs
namespace Switch_Window_Test2
{
/// <summary>
/// Interaktionslogik für A_UI.xaml
/// </summary>
public partial class A_UI : UserControl
{
public A_UI()
{
InitializeComponent();
DataContext = this;
}
}
}
Nochmals Danke!
Gruß Mayho
EDIT:
Problem gelöst!!
die Properties müssen natürlich im jeweiligen UI sein und das Binding erfolgt ebenfalls im UI.XAML. Damit die Properties von Außen ansprechbar sind habe ich sie als Static definiert.
Nun rennt das ganze z.B. so:
A_UI.UiA_Visibility = Visibility.Hidden
Please also mark the comments that contributed to the solution of the article
Content-ID: 332643
Url: https://administrator.de/contentid/332643
Printed on: October 10, 2024 at 03:10 o'clock