我在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>
这可能吗?
答案 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”是视图模型的构造函数。