C#UWP绑定splitview IsPaneOpen到viewmodel

时间:2016-08-27 12:17:47

标签: c# xaml mvvm uwp

当我遇到这个问题时,我正在学习通用Windows应用程序上的一些东西: 我想用汉堡按钮构建一个没有代码的splitview菜单。 所以我设置了一个viewmodel,其中包含一个属性和一个用于更改该属性值的命令。检查命令是否被触发我包括一个小的messagedialog。 我将splitview IsPaneOpen绑定到我的viewmodel但不知何故它似乎不起作用。

xaml代码

<Page.Resources>
    <vm:PaneViewModel x:Key="viewModel"/>
</Page.Resources>
<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" DataContext="{StaticResource viewModel}" >
    <Button Content="Test" Command="{Binding Path=OpenPane, Mode=TwoWay}" ManipulationMode="All"/>
    <SplitView DisplayMode="CompactInline" 
               x:Name="Splitview"
               OpenPaneLength="150" 
               CompactPaneLength="20" 
               IsPaneOpen="{Binding IsPaneOpen, Mode=TwoWay}">
        <SplitView.Pane>
            <StackPanel Height="400">
                <Button Height="40">
                    <TextBlock Text="Testbutton" Width="100"/>
                </Button>
            </StackPanel>
        </SplitView.Pane>
        <SplitView.Content>
            <TextBlock Margin="30" Text="{Binding ShowAnything, Mode=TwoWay}"/>
        </SplitView.Content>
    </SplitView>
</StackPanel>

ViewModel代码

    internal class PaneViewModel
{
    public PaneViewModel()
    {
        OpenPane = new OpenPaneCommand(this);
    }
    private bool isPaneOpen = true;
    public bool IsPaneOpen
    {
        get
        {
            return isPaneOpen;
        }

        set
        {
            isPaneOpen = value;
        }
    }
    public string ShowAnything { get { return isPaneOpen.ToString(); } }
    public OpenPaneCommand OpenPane { get; set; }

    public void OpenPaneMethod()
    {
        if (isPaneOpen == false)
            isPaneOpen = true;
        else
            isPaneOpen = false;
    }
}

和命令代码

    internal class OpenPaneCommand : ICommand
{
    public OpenPaneCommand(PaneViewModel ViewModel)
    {
        this.viewModel = ViewModel;
    }
    private PaneViewModel viewModel;

    public event EventHandler CanExecuteChanged;

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public void Execute(object parameter)
    {
        Blub();
        viewModel.OpenPaneMethod();
    }
    async private void Blub()
    {
        var dialog = new MessageDialog("Testausgabe");
        await dialog.ShowAsync();
    }
像我说的那样 - messagedialog显示出来,但是splitview.content或ispaneopen中的textblock似乎都没有改变。 debuging告诉我,我改变值的方法确实改变了这个值。 所以我想知道我的绑定或datacontext设置是否已关闭。

也许你们有一个暗示我的错误来自我。

谢谢!

meq

2 个答案:

答案 0 :(得分:1)

您的绑定无法正常工作,因为ViewModel上未通知View。您的VM需要实现INotifyPropertyChanged接口,并在您的属性更改时引发PropertyChanged事件。

所以通常你会把这样的东西放到你的二传手:

...
set 
{
   isPaneOpen = value;
   PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("IsPaneOpen");
}
...

答案 1 :(得分:0)

我认为您的视图模型应该继承ObservableObject。 并且所有属性应该更新如下:

 public bool IsPaneOpen
        {
            get { return isPaneOpen; }
            set
            {
                this.Set<bool>(ref this._loisPaneOpendedPendingCount, value);
            }
        }

ShowAnything属性

相同