我正在使用MVVM模式,我的页面中有LongListSelector,但我不知道如何进行这些绑定:
我想在每一行中都有一个按钮,它对该行中的对象执行某些操作。我在ViewModel中做了这个准备:
private RelayCommand<Module> goToTrackingPageCommand;
public RelayCommand<Module> GoToTrackingPageCommand
{
get
{
return goToTrackingPageCommand
?? (goToTrackingPageCommand = new RelayCommand<Module>(
NavigateToTrackingPage));
}
}
private void NavigateToTrackingPage(Module module)
{
App.Current.SelectedModule = module;
navigationService.NavigateTo(new Uri("/Views/ModuleTrackingPage.xaml"), UriKind.Relative);
}
我试图像这样绑定它:
<Button x:Name="ShowButton" Content="Show"
Command="{Binding GoToTrackingPageCommand}"
CommandParameter="{Binding}"/>
它不起作用,因为按钮位于datatemplate中,当有绑定时,它会转到选定的Module对象但不会转到ViewModel。所以我的第一个问题是如何解决它?
第二个问题我觉得很复杂,但希望两者都能轻松解决。我想在每一行中都有ToggleSwitch,当值改变时我想调用http请求。我在datatemplate中有这个:
<toolkit:ToggleSwitch x:Name="LockSwitch" IsChecked="{Binding IsLock}" />
我可以更改绑定到TwoWay,但我更改了对象中的值,我想在ViewModel中使用Module参数调用方法。我可以更改此绑定吗?我应该从View对象中调用ViewModel中的方法吗?或者我应该以某种方式告诉ViewModel这个对象是否改变了这个值?或者我应该绑定Checked和Unchecked事件吗?
答案 0 :(得分:2)
关于按钮: 您可以使用elementName绑定访问“parent datacontext”并设置命令参数:
<Button Command="{Binding DataContext.GoToXyCommand, ElementName=LayoutRoot}" CommandParameter="{Binding}" />
关于你的第二个问题:
首先,我会检查切换按钮是否是正确的解决方案,如果更改值会触发持续时间可能更长的进程。
WP执行此操作的示例是启用/禁用Air-Plane模式。
我会这样做:
编辑:这是我最近使用的ViewModel的示例。
public bool IsUpdatingPushEnabled
{
get { return _isUpdatingPushEnabled; }
set { SetProperty(ref _isUpdatingPushEnabled, value); }
}
public bool IsPushEnabled
{
get { return _isPushEnabled; }
set
{
if (!IsUpdatingPushEnabled)
{
SetProperty(ref _isPushEnabled, value);
var t = SetPushAsync();
}
}
}
private async Task SetPushAsync()
{
IsUpdatingPushEnabled = true;
try
{
var result = await _settingService.EnablePushAsync(IsPushEnabled);
SetProperty(ref _isPushEnabled, result, "IsPushEnabled");
}
catch
{
//...
}
IsUpdatingPushEnabled = false;
}