[英]When and how to call asynch method in ViewModel in windows phone wp8
[英]WP8 call method in viewmodel from object in collection
我有一个longlistselector,每行中都有ToggleSwitch,当ToggleSwitch更改时,我想通过ApiService调用http请求。 由于注入,我在ViewModel中拥有ApiService类,在ViewModel中,我具有带有开关的Modules的ObservableCollection。 我将其与datatemplate绑定,并且将ToggleSwitch绑定到bool属性没有问题。 但是我应该如何处理该财产?
型号-Modul.cs
public int IsLock
{
get { return isLock; }
set {
Set(() => IsLock, ref isLock, value);
// What should I do here? How call ViewModel method?
}
}
ViewModel-ModuleListViewModel.cs
public ObservableCollection<Module> Modules { get; private set; }
// here I have apiService instance
// and here I could call apiService.Lock(module) and so on
视图-DataTemplate的一部分
<toolkit:ToggleSwitch x:Name="LockSwitch"
IsChecked="{Binding IsLock, Mode=TwoWay}"/>
正确的方法是什么? 也许我可以在每个Modul类中都有ApiService类,但是我认为这很糟糕。 我认为ViewModel应该以某种方式发现Model已更改,并且应该调用method。
我建议使用ToggleSwitch的Command
属性,该属性将在用户每次更改切换开关时执行,并允许您绑定到父数据上下文。 在XAML中使用类似以下内容的代码:
<ItemsControl x:Name="items" ItemsSource="{Binding Modules}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<toolkit:ToggleSwitch x:Name="LockSwitch"
Command="{Binding ElementName=items,Path=DataContext.LockToggleCommand}"
CommandParameter="{Binding}"
IsChecked="{Binding IsLock, Mode=TwoWay}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
然后只需将“ LockToggleCommand”添加到您的主视图模型,然后调用服务,例如:
public ObservableCollection<Module> Modules { get; private set; }
public ICommand LockToggleCommand { get; private set; }
public ViewModel()
{
LockToggleCommand = new DelegateCommand<Module>(module => {
apiService.Lock(module);
});
}
在这里,“ DelegateCommand”只是ICommand
的常规实现-我确信MVVM Light具有自己的标准实现。
编辑
我以为ToggleSwitch
支持Command
,但是由于它不支持,因此可以使用EventTrigger采取类似的方法(如果您愿意将System.Windows.Interactivity和Microsoft.Expression.Interactions DLL添加到您的项目中):
<ItemsControl x:Name="items" ItemsSource="{Binding Modules}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<toolkit:ToggleSwitch x:Name="LockSwitch"
IsChecked="{Binding IsLock, Mode=TwoWay}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Toggled">
<ei:CallMethodAction TargetObject="{Binding ElementName=items,Path=DataContext}"
MethodName="OnToggled"
/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
现在,将“ OnToggled”方法添加到主视图模型中-使用“ sender”参数获取当前项,如下所示:
public void OnToggled(object sender, RoutedEventArgs e)
{
var toggleSwitch = (ToggleSwitch)sender;
var module = (Module)toggleSwitch.DataContext;
apiService.Lock(module);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.