0

我在 C# 中使用视图模型创建了一个简单的应用程序,通常您必须在窗口或用户控件的数据上下文中声明视图模型才能加载。问题是只要 Visual Studio 打开应用程序,它就会加载。

我希望它在应用程序运行并加载窗口时加载。

<Window x:Class="GraphApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:ViewModel="clr-namespace:GraphApp"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <!-- Insert Model view Here. I want it to load when the window is running, not when I have it opened in visual studio.-->

    </Window.DataContext>

这可能吗?

4

3 回答 3

4

通常,当我们希望在元素加载后发生某些事情时,我们会处理FrameworkElement.Loaded事件

public MainWindow()
{
    InitializeComponent();
    Loaded += MainWindow_Loaded;
}

private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    DataContext = new ViewModel();
}

更新>>>

实现这一点的另一种方法是设置一些DataTemplates 并具有您的视图模型类型或公共基本视图模型类的属性:

public BaseViewModel ViewModel { get; set; } // Implement INotifyPropertyChanged here

然后在App.xaml Resources

<DataTemplate DataType="{x:Type ViewModels:FirstViewModel}">
    <Views:FirstTrackView />
</DataTemplate>
...
<DataTemplate DataType="{x:Type ViewModels:LastViewModel}">
    <Views:LastTrackView />
</DataTemplate>

然后你可以用这种方式隐式设置DataContext任何时候,相应的视图将自动显示:

ViewModel = new SomeViewModel();
于 2013-11-06T15:12:02.330 回答
0

附加到Window.Loaded事件并:

void OnLoad(object sender, RoutedEventArgs e)
{
    //Check if the event is not raised by the visual studio designer
    if(DesignerProperties.GetIsInDesignMode(this))
      return;

    //Set the data context:
    this.DataContext = //Your viewmodel here
}
于 2013-11-06T15:15:17.107 回答
0

我知道这已经过时了,但是您可以通过首先添加视图模型所在的命名空间来实现这一点。

xmlns:vm="clr-namespace:MyWpfForm.ViewModel"

然后将其直接添加到您的关闭窗口元素下

<Control.DataContext>
   <vm:MainWindowViewModel />
</Control.DataContext>

其中“MainWindowViewModel”是您的视图模型的构造函数。

于 2018-01-24T20:22:08.130 回答