Xamarin Forms Interrupteur à Bascule événement ne se lient pas avec viewmodel
J'ai un Formes XAML Page et là, j'ai une listview, et chaque élément a un Switch (xamarin par défaut). Je peux lier les données à partir des éléments de la liste, mais je ne peux pas abonnez-vous que le Commutateur de l'événement "Basculé", car il provoque l'élément de ne pas le montrer. J'ai aussi essayé avec ICommand et de Commande, il est demandé de le faire avec des boutons, mais le résultat est le même, rien montré. Comment puis-je gérer la bascule de l'interrupteur de mon viewmodel?
Vue
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="TouristicWallet.Views.WalletManagementPage"
xmlns:vm="clr-namespace:TouristicWallet.ViewModels"
xmlns:converters="clr-namespace:TouristicWallet.Converters"
>
<ContentPage.BindingContext>
<vm:WalletManagementViewModel x:Name="ViewModel"/>
</ContentPage.BindingContext>
<ContentPage.Resources>
<ResourceDictionary>
<converters:CurrencyIdToCodeConverter x:Key="idToCodeConverter"/>
</ResourceDictionary>
</ContentPage.Resources>
<StackLayout>
<ListView x:Name="MyCurrencies" ItemsSource="{Binding Currencies, Mode=OneWay}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Horizontal">
<Label Text="{Binding Currency.Initials, Mode=OneWay}" />
<Switch IsToggled="{Binding IsOwned, Mode=TwoWay}"
Toggled="{Binding Toggled}"
/>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>
ViewModel
public class WalletManagementViewModel : ViewModelBase
{
private readonly List<OwnedCurrencyWrapper> _currencies = new List<OwnedCurrencyWrapper>();
public List<OwnedCurrencyWrapper> Currencies { get { return _currencies; } }
public WalletManagementViewModel()
{
CurrencyDataAccess cda = new CurrencyDataAccess();
foreach (var item in cda.GetCurrencies())
{
Currencies.Add(new OwnedCurrencyWrapper(item));
}
OnPropertyChanged(nameof(Currencies));
}
public class OwnedCurrencyWrapper
{
public Currency Currency { get; private set; }
public Boolean IsOwned { get; set; }
public ICommand Toggled { get; set; }
public OwnedCurrencyWrapper(Currency currency)
{
Currency = currency;
WalletDataAccess wda = WalletDataAccess.Instance;
IsOwned = wda.IsOwned(Currency.Id);
Toggled = new Command(() => Update());
}
public void Update()
{
WalletDataAccess wda = WalletDataAccess.Instance;
if (IsOwned) wda.RemoveOwnedCurrency(Currency.Id);
else wda.OwnCurrency(Currency.Id);
}
public void Toggled_handler(object sender, ToggledEventArgs e)
{
Update();
}
}
}
Je ne suis pas à l'aide de tout mvvm cadre
OriginalL'auteur Daniel Mendonça | 2016-12-09
Vous devez vous connecter pour publier un commentaire.
Tout d'abord un Commutateur ne peut pas se lier à un
Command
. Voir:https://developer.xamarin.com/guides/xamarin-forms/xaml/xaml-basics/data_bindings_to_mvvm/#Commanding_with_ViewModels
À partir de ci-dessus, les contrôles de Formulaires qui peuvent se lier à un
ICommand
sont:ImageCell )
vous pouvez simplement faire ce qui suit pour exécuter du code dans la Vue du fichier code-behind, dans le code XAML:
Et puis dans le fichier Code-behind:
Alternativement, puisque vous êtes de liaison, vous pouvez exécuter le code dans le réel
OwnedCurrencyWrapper
classe (qui est ce que vous semblez vouloir) en ajoutant du code de l'ouvreur de laIsOwned
. DANS ce cas, ne pas affecter quoi que ce soit à la Bascule de la propriété de votre commutateur::Et puis dans votre
OwnedCurrencyWrapper
classe:Cela dit, votre liaison n'est pas complète, puisque votre modèle de vue n'est pas la mise en œuvre de
INotifyPropertyChanged
les changements apportés directement à la vue du modèle ne sera pas reflétée dans l'INTERFACE utilisateur. Pour plus d'informations sur la liaison avec les Formes MVVM, voir:https://developer.xamarin.com/guides/xamarin-forms/xaml/xaml-basics/data_bindings_to_mvvm/
Mise à JOUR: je n'était pas au courant de Comportements de Xamarin Forms. Voir:
https://github.com/xamarin/xamarin-forms-samples/tree/master/Behaviors/EventToCommandBehavior
Donc cela devrait vous permettre de lier la Bascule de l'événement à une Commande.
Voici une autre option, les Comportements: github.com/xamarin/xamarin-forms-samples/tree/master/Behaviors/... "les comportements sont une approche utile pour le raccordement d'une commande à une commande. En outre, ils peuvent aussi être utilisés pour associer des commandes avec des contrôles qui n'ont pas été conçus pour interagir avec les commandes. Cet exemple illustre l'utilisation d'un comportement à invoquer une commande lorsqu'un événement est déclenché." Je n'étais pas au courant de Comportements avant, désolé.
OriginalL'auteur jgoldberger - MSFT
Si vous adhérez à Prisme cadre, vous pouvez facilement le fil d'un événement à une commande. Votre xaml va ressembler à l'exemple suivant.
OriginalL'auteur Mircea Matei