2013-06-05 43 views
0

我有RootViewModel類,我想從那裏訪問UI元素(在MainWindow中實例化)。爲此我這樣設置班級:如果繼承MainWindow,則應用程序無法啓動

class RootViewModel : MainWindow, INotifyPropertyChanged 

但是該應用程序無法啓動。它編譯並拋出沒有錯誤,但窗口不出現。如果我刪除MainWindow,我無法訪問我在MainWindow.xaml中創建的元素。我能做些什麼來解決這個問題?

編輯:好吧,我明白,我不應該這樣做,這是違背什麼是MVVM。但有沒有辦法從MainWindow直接修改某些東西?我應該嘗試什麼,而不是這個?

+5

你想達到什麼目的?這似乎表面上,就像對MVVM的一個可怕的誤解。 – Gusdor

+0

ViewModel不應該從UI相關類繼承......它沒有任何意義 –

+0

也許是這樣,我試圖將DynamicDataDisplay繪圖儀綁定到一些數據,這是用動態創建的加載器加載的。但很難弄清楚如何將「LineGraphs」(持有繪圖儀的物體)綁定到它上面。所以我的(當然是錯誤的)方法是嘗試手動設置它。 – Sturm

回答

0

考慮將RootViewModel更改爲UserControl。給它一個名爲Element的DependencyProperty,類型UIElement

將RootViewModel添加到MainWindow的XAML並綁定到要使用的元素,如下所示;

<RootViewModel Element="{Binding ElementName=SourceElement}"/> 
0

WPF窗口是對象,所以你可以隨時手動實例化他們,就像這樣:

var foo = new FooWindow(); // new Window object 
foo.Show(); // show window as non-blocking "dialog" 

如果你這樣做,你可以訪問到窗口的任何publicprotected成員 - 包括任何兒童控制,只要他們的Accessibility屬性相應標記。所以,如果FooWindow有一個TextBox命名txtFooName,你可以像這樣訪問:

string name = foo.txtFooName.Text // get string value from textbox 

還可以分配到任何公共/ protected成員:現在

foo.txtFooName.Text = "Fizz Buzz, Inc."; 

MainWindow一般設置爲該應用程序的StartupUri(位於App.xaml),這使它成爲應用程序的入口點,所以我不完全確定你要做什麼。

0

我能夠實現我想要的東西通過創建一個

public ObservableCollection<ChartPlotter> myPlotCollection { get; set; } 

,再加入CHARTPLOTTER那裏,並在XAML中設置:

<DockPanel Grid.Column="2"> 
     <ItemsControl Width="Auto" 
        Height="Auto" 
        ItemsSource="{Binding myPlotCollection}"> 
     </ItemsControl> 

    </DockPanel> 

於是就這樣我有完全控制什麼發生在myPlotCollection [0]中。在這一刻對我來說已經足夠了,以後我會給它另一個嘗試正確地綁定它。感謝您的回覆,抱歉,這可能有點愚蠢的問題。

+0

不要忘記將答案標記爲答案。你也可以刪除你的問題,如果你認爲它不會幫助未來的人 – WiiMaxx

+0

我不知道是否有一個人像我一樣笨拙,但以防萬一我會保留它。我現在不能將它標記爲答案(SO限制)。 – Sturm