2014-01-19 90 views
1

在我的C#WPF項目(使用VS2012工作),我的目標是在我創建了一個新的窗口中使用從一個類的現有數據...使用元素在新窗口中

所以我增加了一個新的窗口(WPF)到我的項目並稱之爲DijkstraWindow。在我的MainWindow中有一個Menu,當你點擊合適的項目時,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> 

這也不能正常工作,那麼我的DijkstraWindo w沒有關於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

編譯器抱怨,因爲你的視圖的類型Graphomat.DijkstraWindow沒有聲明xaml和.cs文件之間的相同基本類型。您的cs文件可能會說它繼承了Window類型。

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

在項目中對所有視圖模型使用基類是非常普遍的。想想看,你是結合所有的意見,以個人觀點的機型,它不僅使你會在基類來創建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中定義您的視圖。

請檢查SO問題:MVVM: Tutorial from start to finish?在該線程中鏈接的教程應該讓您的頭圍繞對成功執行MVVM模式至關重要的概念。

+0

感謝您的詳細評論。認爲這樣做會更容易。在閱讀教程時,似乎有必要重構我的完整應用程序。目前我不確定我的視圖,模型或模型視圖是什麼,我的代碼與所有內容混雜在一起... – mho

相關問題