我正在使用MVVM-Pattern为Windows RT / 8.1开发一个小应用程序。
问题是,单击时,绑定命令(来自ViewModel)到Page.BottomAppBar中CommandBar中的AppBarButton不会触发。如果我将DataContext设置为Page.BottomAppBar中CommandBar中的ViewModel,它也不起作用。
如果我将没有Page.BottomAppBar的CommandBar-Code移动到网格中,该命令工作正常,但应用程序不再检测到背景上的点击,这意味着CommandBar不会关闭,当它应该是。
我认为,它与DataContext-Binding有关,但我没有线索,如何解决这个问题。
也没有出现错误或提示。那里有解决方案吗?非常感谢你! :)
WorkListView.xaml:设置ViewModel
<Page.Resources>
<x:String x:Key="AppName">My Worklist</x:String>
<vm:WorkListViewModel x:Key="viewModel"/>
</Page.Resources>
WorkListView.xaml:为网格设置DataContext(仅供参考)
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" DataContext="{StaticResource viewModel}">
WorkListView.xaml:将命令绑定到BottomAppBar中的AppBarButton(这不起作用;单击时RefreshCommand不会启动)
<Page.BottomAppBar>
<CommandBar x:Name="cmdBar" Background="#FF7300">
<AppBarButton Icon="Refresh" Label="Refresh" IsEnabled="True" Command="{Binding RefreshCommand}"/>
</CommandBar>
</Page.BottomAppBar>
WorkListView.xaml:Grid中Command的替代绑定(这样可行,但应用程序不再检测背景上的点击)
<Grid Grid.Row="2">
<CommandBar x:Name="cmdBar" Background="#FF7300">
<AppBarButton Icon="Refresh" Label="Refresh" IsEnabled="True" Command="{Binding RefreshCommand}"/>
</CommandBar>
</Grid>
WorkListViewModel.cs:将RefreshCommand / Delegate RefreshCommand设置为OnExecuteRefreshCommand
private DelegateCommand _refreshCommand;
public DelegateCommand RefreshCommand
{
get { return _refreshCommand; }
set { this.SetProperty<DelegateCommand>(ref _refreshCommand, value); }
}
public WorkListViewModel()
{
this.ItemsView = this.CreateCollectionView(_workList);
this.ItemsView.CurrentChanged += this.OnCurrentItemChanged;
this.RefreshCommand = new DelegateCommand(this.OnExecuteRefreshCommand);
}
private async void OnExecuteRefreshCommand(object parameter)
{
ItemsView.Clear();
SetList(await Helpers.WebServiceConnector.refreshWorkList());
}
//编辑: 我已经在OnExecuteRefreshCommand中设置了一个破解点来检查应用程序是否中断。显然,它似乎根本不承认绑定。
另一个奇怪的事情是,当我右键单击AppBarButton中Command Binding中的“RefreshCommand”并单击“Go To Definition”时,Visual Studio会立即将我重定向到ViewModel中的RefreshCommand方法。
答案 0 :(得分:0)
我解决了问题:
我所要做的就是:将ViewModel放入App.xaml Resources,而不是放入Page Resources:
App.xaml Application.Resources
<Application.Resources>
<ResourceDictionary>
<vm:WorkListViewModel x:Key="workVM" />
</ResourceDictionary>
</Application.Resources>
并将其直接绑定到WorkListView页面并删除Grid中的绑定:
WorkListView.xaml
DataContext="{StaticResource workVM}"´
之前两个绑定之间可能存在冲突。