2016-12-25 4 views
0

Ich bin auf ein Problem gestoßen, das ich nicht verstehen kann und ich habe keine Lösung hier oder bei Google gefunden. Ich brauchte eine Möglichkeit, mein Viewmodel über Änderungen der Anwendungsgröße zu informieren, um die Sichtbarkeit von Spalten in meinem Grid zu ändern. Die Lösung, die ich verwende, ist nicht die schönste. Wenn Sie also einen anderen Vorschlag haben, bin ich dankbar.Setter wird zweimal aufgerufen

Das Problem ist, dass wenn der adaptive Trigger auslöst, es den Wert eines in zwei Richtungen gebundenen Textes in einem versteckten Textfeld aktualisiert. Dies wird dann an das Viewmodel übergeben und das Layout wird aktualisiert. Aber aus irgendeinem Grund wird der alte Wert wieder direkt nachgeschoben und nur die Änderungen zurückgesetzt. Der Setter wird also zweimal mit dem neuen korrekten Wert und direkt danach mit dem alten Wert aufgerufen.

XAML:

 <VisualStateGroup x:Name="Base"> 
      <VisualState x:Name="Full"> 
       <VisualState.StateTriggers> 
        <AdaptiveTrigger MinWindowWidth="1024"/> 
       </VisualState.StateTriggers> 
       <VisualState.Setters> 
        <Setter Target="NavigationRow.Height" Value="0"/> 
        <Setter Target="HelperBox.Text" Value="Full"/> 
       </VisualState.Setters> 
      </VisualState> 
      <VisualState x:Name="Medium1"> 
       <VisualState.StateTriggers> 
        <AdaptiveTrigger MinWindowWidth="600"/> 
       </VisualState.StateTriggers> 
       <VisualState.Setters> 
        <Setter Target="HelperBox.Text" Value="Medium"/> 
       </VisualState.Setters> 
      </VisualState> 
      <VisualState x:Name="Small1"> 
       <VisualState.StateTriggers> 
        <AdaptiveTrigger MinWindowWidth="0"/> 
       </VisualState.StateTriggers> 
       <VisualState.Setters> 
        <Setter Target="HelperBox.Text" Value="Small"/> 
       </VisualState.Setters> 
      </VisualState> 
     </VisualStateGroup> 

Verborgene Textbox:

<TextBox x:Name="HelperBox" Text="{Binding ApplicationSize, 
Mode=TwoWay, UpdateSourceTrigger=Default}" 
Visibility="Collapsed"/> 

Ansichtsmodell Die gebundene string:

private string _applicationSize; 
    public string ApplicationSize 
    { 
     get { return _applicationSize; } 
     set 
     { 
      _applicationSize = value; 
      UpdateLayout(); 
     } 
    } 

Die UpdateLayout Methode:

private void UpdateLayout() 
    { 
     switch (ApplicationSize) 
     { 
      case "Small": 
       FirstColumnVisibility = true; 
       SecondColumnVisibility = false; 
       ThirdColumnVisibility = false; 
       break; 
      case "Medium": 
       FirstColumnVisibility = true; 
       SecondColumnVisibility = true; 
       ThirdColumnVisibility = false; 
       break; 
      case "Full": 
       FirstColumnVisibility = true; 
       SecondColumnVisibility = true; 
       ThirdColumnVisibility = true; 
       break; 
     } 
    } 
+0

Ich bin mir nicht sicher, was ist dein Problem, kannst du bitte eine fertige Demo nach [mcve] hochladen? –

+0

Ich bin mir des Problems nicht sicher. Sie können jedoch immer ein anderes Bedienfeld verwenden, anstatt die Spalte eines Gitters auszublenden. Ich meine, es sollte möglich sein, das Layout in einem separaten Panel zu platzieren, das Sie verstecken möchten. – saurabh

Antwort

0

Vielen Dank für Ihre Antworten. Ich löste es, indem ich die Breite der enthaltenen Gitter mit den Triggern änderte. Die Breite wurde auch an das Ansichtsmodell gebunden und auf diese Weise konnte ich die Daten entsprechend aktualisieren.

Verwandte Themen