Laden...

UserControl vorherigen Zustand übernehmen

Erstellt von Sebrahi vor 2 Jahren Letzter Beitrag vor 2 Jahren 243 Views
S
Sebrahi Themenstarter:in
22 Beiträge seit 2020
vor 2 Jahren
UserControl vorherigen Zustand übernehmen

Hallo zusammen,
mein Problem ist, dass wenn ich im Menü zwischen den UserControls wechsele, dass dann die Zustände nicht gespeichert werden.
Z.b in UserControl_2 wird ein Button deaktiviert. Aber wenn ich dann zu UserControl_1 gehe und dann wieder zu UserControl_2 Wechsel, dann ist der Button wieder aktiviert.
Dies liegt daran, dass UserControl_2 mit InitializeComponent() wieder alles neu lädt wie bei seinem Anfangszustand und da war der Button aktiviert.

Nun die frage wie ich das Problem am besten löse?


//UserControl_1.cs:
namespace My_WPF
{
    public partial class UserControl_1: UserControl
    {
        public UserControl_1()
        {
            InitializeComponent();
        }

    }
}

//UserControl_2.cs:
namespace My_WPF
{
    public partial class UserControl_2: UserControl
    {
        public UserControl_2()
        {
            InitializeComponent();
        }

        private void myButton_Click(object sender, RoutedEventArgs e)
        {
            myButton.IsEnabled = false;
        }
    }
}


//App.xaml (ohne layout):

        <x:Array x:Key="NavigationMenuItems" Type="s:String">
            <s:String>UserControl_1</s:String>
            <s:String>UserControl_2</s:String>
        </x:Array>

        <DataTemplate x:Key="UserControl_1_Template">
            <local:UserControl_1/>
        </DataTemplate>
        <DataTemplate x:Key="UserControl_2_Template">
            <local:UserControl_2/>
        </DataTemplate>

// MainWindow.xaml:

<Window.Resources>
        <Style x:Key="NavigationContentStyle" TargetType="ContentControl">
            <Setter Property="ContentTemplate" Value="{StaticResource UserControl_1_Template}"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=NavigationMenuListBox, Path=SelectedItem}"
                             Value="UserControl_2">
                    <Setter Property="ContentTemplate" Value="{StaticResource UserControl_2_Template}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
</Window.Resources>

<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" MinWidth="155"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>

        <ListBox x:Name="NavigationMenuListBox" 
                 Style="{StaticResource NavigationListBoxStyle}"
                 ItemContainerStyle="{DynamicResource NavigationListBoxItemStyle}"                     
		 ItemsSource="{StaticResource NavigationMenuItems}"
        />

        <ContentControl Grid.Column="1" Style="{StaticResource NavigationContentStyle}"/>      

</Grid>


S
Sebrahi Themenstarter:in
22 Beiträge seit 2020
vor 2 Jahren

Hallo,
danke für deine Antwort. Leider hat dies nichts verändert. Weder mit true nocht mit false.


        <DataTemplate x:Key="UserControl_1_Template" x:Shared="true">
            <local:UserControl_1/>
        </DataTemplate>
        <DataTemplate x:Key="UserControl_2_Template" x:Shared="true">
            <local:UserControl_2/>
        </DataTemplate>

4.939 Beiträge seit 2008
vor 2 Jahren

Sorry, dann scheint das nicht so einfach zu gehen (ich habe gerade auch gelesen, daß wohl x:Shared="true" der voreingestellte Wert bei Resources ist).

Hast du denn schon MVVM eingesetzt (s.a. [Artikel] MVVM und DataBinding)?
Ich empfehle dir dazu den Artikel (sowie das Projekt) Navigation with MVVM - dort wird nur einmalig ein ViewModel je Page erzeugt (so daß zwar die Controls evtl. immer wieder erzeugt werden, aber die gebundenen Daten den aktuellen Zustand wieder herstellen).

5.658 Beiträge seit 2006
vor 2 Jahren

Das ViewModel ist dafür verantwortlich, Zustände zu speichern. Die Benutzeroberfläche ist nur dazu da, die Zustände anzuzeigen und auf Benutzereingaben zu reagieren.

In deinem Beispiel wird das UserControl jedes Mal neu erstellt, dadurch geht der Zustand verloren. Erstelle dir ein ViewModel und binde das an das UserControl, dann wird es funktionieren. Siehe dazu den von Th69 verlinkten Artikel, sowie [Artikel] Drei-Schichten-Architektur

Weeks of programming can save you hours of planning