mayho33
Goto Top

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
<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

Content-Key: 332643

Url: https://administrator.de/contentid/332643

Printed on: April 19, 2024 at 07:04 o'clock