mayho33
Goto Top

C-Sharp MVVM DataContext geht verloren

Hallo @ All!

Ich kaue schon wieder an einem Problem mit WPF in C# und hoffe aufs Neue auf eure Hilfe, weil ich der Lösung einfach nicht auf die Spur komme.

Ich habe ein MainWindow mit mehreren UserControls. Einige davon sind vom Aufbau her identisch. Mit 2 Buttons im MainWindow schalte ich zwischen den UserControl hin und her.

So bringe ich die Controls in Reihenfolge::
private static Dictionary<int, UserControl> _UserControlSequence = new Dictionary<int, UserControl>();
        public Dictionary<int, UserControl> UserControlSequence
        {
            get
            {
                if (_UserControlSequence.Count < 1)
                {
                            _UserControlSequence.Add(0, WizzardWelcome);
                            _UserControlSequence.Add(1, WizzardSelect);
                            _UserControlSequence.Add(2, WizzardPrerequisites);
                            _UserControlSequence.Add(3, WizzardSetups);
                            _UserControlSequence.Add(4, WizzardAdditionals);
                            _UserControlSequence.Add(5, WizzardBuild);
                }
                return _UserControlSequence;
            }
    }

Im XAML des MainWindow mache ich die UserCotrols so bekannt:
<Window
    ....
    ....
    xmlns:uControls="clr-namespace:myProj"  

<grid>
<uControls:WizzardPrerequisites
     x:Name="WizzardPrerequisites"  
     Margin="20,50,375,78"  
     Panel.ZIndex="1000"  
     Visibility="Hidden"/>  


<uControls:blablabla
     ...
     ...
      ...
     .../>

</grid>
>/Window>
So frage ich das entsprechende Control ab;
forech(var control in UserControlSequence)
{
    if(control.Key == nextControl)
        control.Value.Visibility = System.Windows.Visibility.Visible;
    else
    control.Value.Visibility = System.Windows.Visibility.Hidden;
}

Das funktioniert gut soweit. DataContext <> Properties passt auch.

Nun mein Problem:
Ich habe 3 UserControls wie im Bild unten. Die RadioButtons binde ich im jeweiligen Model auf ein enum-Property. Das ganze läuft über einen IValueConverter so wie es in diesem Example von Colinardo dargestellt ist: C-Sharp WPF XAML CheckBox.IsEnabled wenn ListViewItem.Select

Sobald das UserControl "visible" ist wird einer der RadioButtons vorselektiert. Das funktioniert auch, aber nur, wenn ich nicht mehr als 1 UserControl entsprechend herrichte. Sobald ich ein zweites mit dem Radiobuttons, enum-Property und IValueConverter ausstatte, wird der DataContext auf das Zuletzt initialisierte UserControl gesetzt. Der Effekt ist, dass beim Visible setzen des ersten UserControls keiner der RadioButtons ausgewählt ist, erst beim zuletzt initialisierten.

So sehen die UserControls aus:
ucontrol


Was kann ich tun um den DataContext sicher auf das entsprechende UserControl zu setzen?
Habe mich schon damit und ähnlichem versucht: https://www.codeproject.com/questions/589901/inheritanceplusofplusdataco ...

Leider ohne Erfolg.

Danke für eure Hilfe!

Mayho

Content-Key: 327092

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

Ausgedruckt am: 19.03.2024 um 07:03 Uhr

Mitglied: mayho33
mayho33 23.01.2017 um 10:54:51 Uhr
Goto Top
Hi @ All

Habe die Lösung gefunden:

Jedes UserControl verwendet im eigenen Model gleichnamige Properties.
Nachdem ich das Property welches auf die RadioButtons gebinded ist, auf je ein anders lautendes Enum-Property (mit gleichem Inhalt) verweisen ließ und das gebindete Property für die RadioButtons auch unterschiedliche Namen gegeben habe, tritt der gewünschte Effekt ein.

Warum das so ist, ist mir zwar noch schleierhaft, aber es funktioniert. Das ist die Hauptsache.

BSP UserControl A:
//ENUM
public enum FILE_TYPE_A
    {
        All,
        Scripts,
        Executables
    } 

//PROPERTY
public FILE_TYPE_A SelectedFileTypeA { get; set; }


//RADIOBUTTON Binding
IsChecked="{Binding SelectedFileTypeA,   
            Converter={StaticResource RBSelector},
            ConverterParameter={x:Static local:FILE_TYPE_A.All}}"  

BSP UserControl B:
//ENUM
public enum FILE_TYPE_B
    {
        All,
        Scripts,
        Executables
    } 

//PROPERTY
public FILE_TYPE_B SelectedFileTypeB { get; set; }


//RADIOBUTTON Binding
IsChecked="{Binding SelectedFileTypeB,   
            Converter={StaticResource RBSelector},
            ConverterParameter={x:Static local:FILE_TYPE_B.All}}"