Comment gérer le Curseur.Événement ValueChanged dans un modèle de vue?
J'ai un PlayerV.xaml Vue avec un Curseur à l'intérieur:
<Slider Value="{Binding CurrentProgress}"/>
et disposent d'un bouton:
<Button Content="next song" Command="{Binding playNext}"/>
Bouton fonctionne correct. Bouton de playNext commande est contenue dans PlayerVM.cs
Je veux du curseur de ValueChanged pour appeler une fonction qui est stocké dans PlayerVM.cs:
[1]:<Slider Value="{Binding CurrentProgress}" ValueChanged="{Binding playNext}"/>
Je sais [1] a une syntaxe incorrecte, je l'ai utilisé pour des raisons de clarté de l'explication.
====Explication Complémentaire====
Je sais que je peux écrire:
<Slider ValueChanged="Slider_ValueChanged" Value="{Binding CurrentProgress}" />
Et dans PlayerV.xaml.cs il y aura
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
//some logic (actions)
}
}
Mais je ne veux pas de logique là-dedans. Je veux qu'il soit dans PlayerVM.cs (comme le bouton de commande des fonctions de gestionnaire).
Comment faire?
Aussi dans mon Application.xaml.cs de démarrage de la fonction est:
private void OnStartup(object sender, StartupEventArgs e)
{
MainWindow _mainWindow = new MainWindow();
PlayerVM playerVM = new PlayerVM();
_mainWindow.DataContext = playerVM;
_mainWindow.Show();
}
Je pense que je suis en train de faire quelque chose de mal. Dans PlayerVM, j'ai un fil (timer tick) qui définit CurrentProgress valeur en fonction de lecteur multimédia.Position. Mais je voulais quand l'utilisateur change la position du curseur -> la position du joueur doivent être passés conformément. Comment puis-je savoir que les Curseurs de valeur a été modifiée par l'utilisateur, et non pas par timer_ticks fonction?
le plus trivial chemin - votre ticker a fixé intrval que les changements de progrès, dans votre setter juste de comparer l'ancienne et la nouvelle valeur, et selon le résultat, faire un choix
J'ai eu une idée pour utiliser ce moyen trivial. Mais, comme il s'est avéré, ma formule précédente était incorrect, et j'ai pensé que ce n'est pas une solution. Maintenant, je formule améliorée et cela fonctionne! Merci, @Den.
OriginalL'auteur bart | 2014-08-05
Vous devez vous connecter pour publier un commentaire.
Vous avez deux options. Tout d'abord, en dépit de ce que vous avez dit ne pas vouloir utiliser code derrière, la seule solution est pour vous de faire exactement cela. Dans le
ValueChanged
gestionnaire d'événement, vous pouvez simplement appeler votre modèle de vue de la méthode lorsque la valeur est modifiée:J'ai offert cette solution parce que je soupçonne que vous êtes nouveau à MVVM et pensez toujours que vous n'êtes pas autorisé à utiliser le code derrière. En fait, c'est pas du tout le cas et pour des raisons purement de l'INTERFACE utilisateur des questions comme cela, c'est un bon endroit pour cela.
Une autre option est juste pour lier des données d'une propriété directement à la
Slider.Value
. Comme leSlider
valeur est modifiée, le bien-être. Par conséquent, vous pouvez simplement appeler votre méthode à partir des données de propriété liée setter:Une autre option consiste à traiter le
ValueChanged
événement dans une Propriété Attachée personnalisée. Il est un peu plus à cette solution que les autres, donc je préfère vous diriger vers les quelques réponses que j'ai déjà écrit pour d'autres questions, plutôt que de ré-écrire tout cela de nouveau. Veuillez voir mes réponses à la Comment définir le Focus à un Contrôle WPF utilisant MVVM? et WPF C# - naviguer WebBrowser sur clic de souris grâce à la Liaison questions pour les explications et les exemples de code de cette méthode.OriginalL'auteur Sheridan
En utilisant l'événement à saluer la logique que vous pouvez lier des événements à votre modèle de vue, mais vous avez besoin d'aide. Vous avez besoin d'utiliser des fonctions de la Système.De Windows.L'interactivité espace de Noms et comprennent un MVVM Light (et peut être d'autres MVVM bibliothèques qui ont cette fonction mais j'utilise MVVM Light).
reportez-vous ceci: Est-il possible de lier un WPF Événement à MVVM ViewModel de commande?
OriginalL'auteur Ponraja