나는 내가 이해할 수없는 문제에 부딪 쳤고 여기 또는 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;
}
}
무엇이 문제인지 잘 모르겠습니다. [mcve]에 따라 완성 된 데모를 업로드 해 주시겠습니까? –
나는이 문제를 잘 모른다. 그러나 그리드 열을 숨기는 대신 항상 다른 패널을 사용할 수 있습니다. 즉, 숨기려고하는 별도의 패널에 레이아웃을 배치 할 수 있어야합니다. – saurabh