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

时间:2014-01-19 15:44:32

标签: c# wpf xaml

在我的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文件..

1 个答案:

答案 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模式至关重要的概念。