在我的C#WPF项目中(使用VS2012)我的目标是在我创建的新窗口中使用类中的现有数据...
因此我在我的项目中添加了一个新窗口(WPF)并将其称为DijkstraWindow。在我的MainWindow中有一个菜单,当您单击合适的项目时,DijkstraWindow将被打开。在我的MainWindow.xaml.cs中,这是执行此操作的代码:
private void Dijkstra_Click(object sender, RoutedEventArgs e)
{
var DWindow = new DijkstraWindow();
DWindow.Show();
}
现在我需要访问数据(在应用程序运行时创建),并将其存储在存储在类中的列表中。但我不知道该怎么做。
我尝试了以下内容:
1
在DijkstraWindow中创建一个新对象:
var mwvm = new MainWindowViewModel();
可以访问数据(在我的新DijkstraWindow中),但它只是获取启动应用程序时初始化的数据。所以这是错误的方式。因为有一些列表在应用程序运行时填充。我想在新窗口中使用这些数据。
2
在我的DijkstraWindow.xaml.cs中,我试图从我的数据所在的类继承,但编译器正在抱怨
“部分声明不得指定不同的基类”
所以我读到你还要改变你的xaml文件,所以把它改成了:
<local:MainWindowViewModel x:Class="Graphomat.DijkstraWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Graphomat"
Title="DijkstraWindow" Height="300" Width="300">
<Grid/>
</local:MainWindowViewModel>
这也不起作用,那么我的DijkstraWindow没有关于show方法的信息?
有人可以帮我解决这个问题吗?
谢谢!
修改的
这是课堂宣言:
*/using somestuff */
namespace Graphomat
{
/// <summary>
/// Interaction logic for DijkstraWindow.xaml
/// </summary>
public partial class DijkstraWindow : MainWindowViewModel
{
public DijkstraWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
}
}
}
尝试从类“MainWindowViewModel”继承,但这不起作用,因为xaml文件..
答案 0 :(得分:1)
编译器抱怨,因为视图的类型Graphomat.DijkstraWindow
未在xaml和.cs文件之间声明相同的基类型。您的cs文件可能表示它继承自Window
类型。
在ViewModel之间传输数据的一种方法是依赖注入。请考虑以下事项:
public class FooView : Window
{
//require data from the parentview to the child view through dependency injection.
//very simplistic, might meet your needs. If you need a full view lifecycle, see MVVM frameworks like
//cliburn.micro
public FooView(INavigationData navigationData)
{
//do something with your data.
}
}
对项目中的所有视图模型使用基类是很常见的。考虑到您将所有视图绑定到单个视图模型,只有在基类上创建INotifyPropertyChanged的基本实现才有意义:
public class MainViewModel : BaseViewModel
{
}
public abstract class BaseViewModel : INotifyPropertyChanged
{
public object Model { get; set; }
#region PropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if(handler != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion
#region Commands
public ICommand OpenFooWindowClicked
{
get
{
//implement your ICommand here... beyond the scope of the question.
}
}
#endregion
}
就类问题而言,如果您遵循典型的MVVM命名约定,那么您似乎正在尝试在xaml中定义ViewModel。虽然这并非闻所未闻,但您可能希望在xaml中定义View。
请查看SO问题:MVVM: Tutorial from start to finish?该主题中链接的教程应该围绕成功执行MVVM模式至关重要的概念。