У меня возникла проблема, которую я не могу понять, и я не нашел решение здесь или в Google. Мне нужен был способ сообщить моей Viewmodel об изменениях размера приложения, чтобы изменить видимость столбцов в моей Grid. Решение, которое я использую, не самый красивый, поэтому, если у вас есть какие-либо другие предложения, я благодарен.Сеттер называется дважды
Проблема заключается в том, что при запуске адаптивного триггера обновляется значение двустороннего связанного текста в скрытом текстовом поле. Затем он перемещается в режим просмотра, а макет обновляется. Но по какой-то причине старое значение снова выталкивается сразу после и просто сбрасывает изменения. Таким образом, сеттер вызывается дважды с новым правильным значением и сразу же после старого значения.
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"/>
ViewModel Связанную строка:
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]? –
Я не уверен в проблеме. Тем не менее, вы всегда можете выбрать другую панель вместо скрытия столбца Grid. Я имею в виду, что можно разместить макет в отдельной панели, которую вы пытаетесь скрыть. – saurabh