窗口加载和WPF

8
我是一名有用的助手,可以将文本翻译成中文。以下是需要翻译的内容:

我在Windows 2012中有一个WPF项目,在其中我需要在窗口加载事件中加载一些信息。不过,我需要在View Model而不是在CodeBehind中完成这个操作。我试图使用以下代码:

在我的xaml中:

<interactivity:Interaction.Behaviors>
    <behaviors:WindowLoadedBehavior LoadedCommand="{Binding WindowLoadedCommand}" />
</interactivity:Interaction.Behaviors>

在我的视图模型中:
private DelegateCommand _WindowLoadedCommand;

public DelegateCommand WindowLoadedCommand
{
    get
    {
        return _WindowLoadedCommand;
    }
    private set
    {
        _WindowLoadedCommand = value;
    }
}

public ShellViewModel()
{
    WindowLoadedCommand = new DelegateCommand(WindowLoadedAction);
}

protected void WindowLoadedAction()
{
    ...
}

我的附加行为:

public class WindowLoadedBehavior : Behavior<FrameworkElement>
{
    [SuppressMessage("Microsoft.StyleCop.CSharp.MaintainabilityRules", "SA1401:FieldsMustBePrivate", Justification = "Dependency Property.  Allow public.")]
    public static DependencyProperty LoadedCommandProperty = DependencyProperty.Register("LoadedCommand", typeof(ICommand), typeof(WindowLoadedBehavior), new PropertyMetadata(null));

    public ICommand LoadedCommand
    {
        get { return (ICommand)GetValue(LoadedCommandProperty); }
        set { SetValue(LoadedCommandProperty, value); }
    }

    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.Loaded += AssociatedObject_Loaded;
    }

    protected override void OnDetaching()
    {
        AssociatedObject.Loaded -= AssociatedObject_Loaded;

        base.OnDetaching();
    }

    private void AssociatedObject_Loaded(object sender, RoutedEventArgs e)
    {
        if (LoadedCommand != null)
            LoadedCommand.Execute(null);
    }
}

所有的OnAttached、AssociatedObject_Loaded和LoadedCommand都被触发了,但是LoadedCommand设置没有被触发,显然WindowLoadedCommand也没有被触发。你有什么线索可以让这个工作起来吗?

1
你为什么不直接绑定到命令呢? - Bob.
据我所读,直接绑定窗口加载事件由于某些原因不起作用。 - Dirk Dastardly
1个回答

38

有几种选项。 这里列出其中的一些:

如何在WPF MVVM中调用窗口的Loaded事件?

然而,万一您或其他人关心您花费了数小时来完成本应只需30秒即可完成的任务,您可能会想尝试使用以下方法。

public MainWindow()
{
    InitializeComponent();

    this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
}

void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    ShellViewModel.Instance.WindowLoadedCommand.Execute(null);
}

2
太完美了!显然,我遇到的问题是在窗口加载之前事件处理类没有正确加载。你的方法(简短明了)避免了这个问题,并使其正确触发。 - Dirk Dastardly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接