当我遇到这个问题时,我正在学习通用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
答案 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
属性