Setter被调用两次

时间:2016-12-25 18:43:52

标签: c# xaml mvvm windows-10-universal

我遇到了一个我无法理解的问题,而且我没有在这里或谷歌找到解决方案。我需要一种方法来通知我的Viewmodel有关应用程序大小的更改,以更改Grid中列的可见性。我使用的解决方案并不是最漂亮的,所以如果你有任何其他的建议,我很开心。

问题是当自适应触发器触发时,它正在更新隐藏文本框中的双向绑定文本的值。然后将其推送到viewmodel并更新布局。但是由于某种原因,旧的值在之后再次被直接推送并且只是重置更改。因此,使用新的正确值将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;
        }
    }

1 个答案:

答案 0 :(得分:0)

感谢您的回复。我通过使用触发器更改包含网格的宽度来解决它。宽度也绑定到视图模型,这样我就可以相应地更新数据。