Est-il possible de déclencher une commande pour notifier le chargement de la fenêtre. En outre, je ne suis pas à l'aide des cadres MVVM (cadres au sens, Caliburn, ONXY, MVVM Toolkit, etc.)Comment faire pour déclencher une commande lorsqu'une fenêtre est chargée dans wpf
Répondre
Pour éviter le code derrière votre point de vue , utilisez la bibliothèque Interactivity (System.Windows.Interactivity dll que vous pouvez télécharger gratuitement auprès de Microsoft - est également livré avec Expression Blend).
Ensuite, vous pouvez créer un comportement qui exécute une commande. De cette façon, le déclencheur appelle le comportement qui appelle la commande.
<ia:Interaction.Triggers>
<ia:EventTrigger EventName="Loaded">
<custombehaviors:CommandAction Command="{Binding ShowMessage}" Parameter="I am loaded"/>
</ia:EventTrigger>
</ia:Interaction.Triggers>
commandAction (utilise également System.Windows.Interactivity) peut ressembler à:
public class CommandAction : TriggerAction<UIElement>
{
public static DependencyProperty CommandProperty = DependencyProperty.Register("Command", typeof(ICommand), typeof(CommandAction), null);
public ICommand Command
{
get
{
return (ICommand)GetValue(CommandProperty);
}
set
{
SetValue(CommandProperty, value);
}
}
public static DependencyProperty ParameterProperty = DependencyProperty.Register("Parameter", typeof(object), typeof(CommandAction), null);
public object Parameter
{
get
{
return GetValue(ParameterProperty);
}
set
{
SetValue(ParameterProperty, value);
}
}
protected override void Invoke(object parameter)
{
Command.Execute(Parameter);
}
}
Je viens de réaliser que ce code est pour Silverlight. Si vous trouvez les déclencheurs/comportements équivalents dans WPF, je pense que les mêmes principes devraient fonctionner. – programatique
Au lieu de CommandAction, il semble y avoir une action existante pour cela, [InvokeCommandAction] (http://msdn.microsoft.com/en-us/library/system.windows.interactivity.invokecommandaction (Expression.40) .aspx) – Patrick
private void Window_Loaded(object sender, RoutedEventArgs e)
{
ApplicationCommands.New.Execute(null, targetElement);
// or this.CommandBindings[0].Command.Execute(null);
}
et XAML
Loaded="Window_Loaded"
J'ai oublié de mentionner que j'utilise MVVM. Quand, une fenêtre est chargée. Il devrait déclencher une commande, que je serai capable d'écouter dans ma classe ViewModel. –
MVVM n'est pas une religion. Vous pouvez ajouter une ligne de code dans CodeBehind et le monde tournera toujours. –
Etes-vous sûr? êtes-vous sûr qu'il continuera à tourner? :) – GONeale
Une façon plus générique à l'aide des comportements est proposé à AttachedCommandBehavior V2 aka ACB et il supporte même plusieurs liaisons-à-commande événement,
Voici un exemple très simple d'utilisation:
<Window x:Class="Example.YourWindow"
xmlns:local="clr-namespace:AttachedCommandBehavior;assembly=AttachedCommandBehavior"
local:CommandBehavior.Event="Loaded"
local:CommandBehavior.Command="{Binding DoSomethingWhenWindowIsLoaded}"
local:CommandBehavior.CommandParameter="Some information"
/>
Presque tous les événements ne peuvent pas tirer une commande dans le ViewModel. Vous pouvez simplement accepter le fait et écrire une ligne de code dans le CodeBehind ou implémenter un motif obscur qui après plusieurs lignes de code complexes font la même chose. #dontbeapurist –
Je ne suis pas d'accord avec @EduardoMolteni. Si l'événement est lié au travail avec des données, vous devrez travailler avec la VM au niveau du code, ce qui peut être facilement évité en utilisant les comportements dans WPF. – JoanComasFdz