如何在加载窗口或视图时加载View模型

时间:2013-11-06 15:06:32

标签: c# wpf xaml

我在C#中使用视图模型创建了一个简单的应用程序,通常你必须在窗口的datacontext或usercontrol中声明视图模型才能加载它。问题是,只要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>

这可能吗?

3 个答案:

答案 0 :(得分:4)

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

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

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

更新&gt;&gt;&gt;

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

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();

答案 1 :(得分: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
}

答案 2 :(得分:0)

我知道现在已经过时了,但您可以先添加视图模型所在的命名空间。

Channels.newChannel

然后直接在关闭的Window Element

下添加
xmlns:vm="clr-namespace:MyWpfForm.ViewModel"

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