[英]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.