C# 在新窗口中使用现有类中的元素

C# 在新窗口中使用现有类中的元素,c#,wpf,xaml,C#,Wpf,Xaml,在我的C#WPF项目(使用VS2012)中,我的目标是在我创建的新窗口中使用类中的现有数据 因此,我在我的项目中添加了一个新窗口(WPF),并将其命名为Dijkstrowindow。在我的主窗口中有一个菜单,当您单击合适的项目时,DijkstraWindow将打开。在my MainWindow.xaml.cs中,这是执行此操作的代码: private void Dijkstra_Click(object sender, RoutedEventArgs e) { var DWindow

在我的C#WPF项目(使用VS2012)中,我的目标是在我创建的新窗口中使用类中的现有数据

因此,我在我的项目中添加了一个新窗口(WPF),并将其命名为Dijkstrowindow。在我的主窗口中有一个菜单,当您单击合适的项目时,DijkstraWindow将打开。在my MainWindow.xaml.cs中,这是执行此操作的代码:

private void Dijkstra_Click(object sender, RoutedEventArgs e)
{
     var DWindow = new DijkstraWindow();
     DWindow.Show();
}
现在我需要访问数据(在应用程序运行时创建的),这些数据存储在一个类中存储的列表中。但我不知道怎么做

我尝试了以下方法:

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.
    }
}
一,

在Dijkstrowindow中创建新对象:

var mwvm = new MainWindowViewModel();
数据是可访问的(在我的新dijkstrowindow中),但它只获取启动应用程序时初始化的数据。所以这是错误的方法。因为在应用程序运行时,有一个填充的列表。我想在新窗口中使用此数据

二,

在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>

这也不起作用,那么我的Dijkstrowindow没有关于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)
    {

    }

  }
*/使用一些东西*/
名称空间图形
{
/// 
///dijkdow.xaml的交互逻辑
/// 
公共部分类Dijkstrowindow:MainWindowViewModel
{
公共dijkindow()
{
初始化组件();
}
私有无效按钮\u单击(对象发送者,路由目标e)
{
}
}
}


试图从类“MainWindowViewModel”继承,但这不起作用,因为xaml文件..

编译器正在抱怨,因为您的视图的类型
Graphomat.DijkstraWindow
在xaml和.cs文件之间没有声明相同的基类型。您的cs文件可能表示它继承自
窗口
类型

在ViewModels之间传输数据的一种方法是依赖项注入。考虑以下事项:

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.
    }
}
对项目中的所有视图模型使用基类是非常常见的。考虑到您将所有视图绑定到各个视图模型,只需在基类上创建IntIfyPrimTyType的基本实现就有意义:

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中定义视图


请检查SO问题:该线程中链接的教程应该让您了解成功执行MVVM模式的关键概念。

感谢您的详细评论。我觉得这样做比较容易。在阅读教程时,似乎有必要重新构造我的整个应用程序。目前我不确定我的视图、模型或模型视图是什么,我的代码与所有内容都混淆了。。。