2016-12-25 2 views
0

나는 내가 이해할 수없는 문제에 부딪 쳤고 여기 또는 Google에서 해결책을 찾지 못했습니다. 내 Grid의 열의 가시성을 변경하기 위해 애플리케이션 크기의 변경 사항에 대해 ViewModel에 알리는 방법이 필요했습니다. 내가 사용하고있는 해결책은 가장 예쁜 것은 아니므로 다른 제안이 있으면 부탁드립니다.Setter가 두 번 호출되었습니다.

적응 형 트리거가 트리거되면 숨겨진 텍스트 상자에서 양방향 바인딩 된 텍스트의 값을 업데이트하는 것이 문제입니다. 그런 다음 뷰 모델로 푸시되고 레이아웃이 업데이트됩니다. 그러나 어떤 이유로 인해 이전 값이 바로 다시 푸시되고 변경 사항이 재설정됩니다. 따라서 setter는 새로운 올바른 값으로 두 번 호출되고 이전 값으로 다시 호출됩니다.

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> 

숨겨진 텍스트 상자 :

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

뷰 모델 바운드 문자열 :

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

에 UpdateLayout 방법 :

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

무엇이 문제인지 잘 모르겠습니다. [mcve]에 따라 완성 된 데모를 업로드 해 주시겠습니까? –

+0

나는이 문제를 잘 모른다. 그러나 그리드 열을 숨기는 대신 항상 다른 패널을 사용할 수 있습니다. 즉, 숨기려고하는 별도의 패널에 레이아웃을 배치 할 수 있어야합니다. – saurabh

답변

0

답변 해 주셔서 감사합니다. 트리거가 포함 된 격자의 너비를 변경하여이를 해결했습니다. 너비는 또한 뷰 모델에 바인딩되어 있으므로 데이터를 적절하게 업데이트 할 수 있습니다.

관련 문제