2016-12-25 6 views
0

У меня возникла проблема, которую я не могу понять, и я не нашел решение здесь или в 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; 
     } 
    } 
+0

Я не уверен, в чем проблема, не могли бы вы загрузить завершенную демонстрационную версию в соответствии с [mcve]? –

+0

Я не уверен в проблеме. Тем не менее, вы всегда можете выбрать другую панель вместо скрытия столбца Grid. Я имею в виду, что можно разместить макет в отдельной панели, которую вы пытаетесь скрыть. – saurabh

ответ

0

Спасибо за ваши ответы. Я решил это, изменив ширину содержащихся сеток с помощью триггеров. Ширина также была привязана к модели представления, и таким образом я мог соответствующим образом обновлять данные.