2012-12-20 51 views
0

我是MVVM的新手,在下面的場景中需要幫助。如何獲取ViewModel(MVVM)中的控件句柄

我在我的視圖中添加了一個堆棧面板,現在我必須通過viewmodel動態添加一些控件到這個堆棧面板。爲此,我需要在viewmodel中使用堆棧面板。任何人都可以請我指導我如何在我的viewmodel中訪問堆棧面板。

我在其他bloge中讀過它可以通過使用Dependency屬性來完成。但我仍然無法想辦法解決這個問題。

+0

你是什麼意思'處理'?你是指參考還是HWND? –

回答

4

幾件事要先注意。 MVVM模式中ViewModel的意圖是提供與View的分離。因此,您的ViewModel應該不瞭解View本身或View中包含的控件。其次,你應該試圖做的是你的視圖綁定到你的ViewModel的屬性(瞭解你的ViewModel作爲你的視圖的DataContext)。通常,您會將控件的ItemsSource屬性綁定到ViewModel中的某個集合。但是,您會注意到StackPanel沒有實現ItemsSource依賴項屬性。相反,使用ItemsControl來代替你的StackPanel。我會建議一些關於MVVM模式和綁定機制的額外閱讀以進一步說明。

+0

感謝您的輸入,我將明確地通過更多的MVVM的東西,但根據我有限的知識,我們可以使用項目源的固有綁定一些數據,如綁定數據列表框,網格,所以我只想確認它會可以綁定不同的控件instate od數據,根據我對perticuler事件的需求,我需要動態創建新的文本框和按鈕,並將其添加到任何UI容器中,例如堆棧面板 – user1886702

+0

您絕對可以將控件綁定到ItemsControl。我經常靜態和動態地完成它。它有助於認爲容器可以容納內容,而不僅僅是數據。內容可以是任何東西(最典型的是某種模板)。 – Backlash

0

完全同意Backlash, 看來你的ViewModel和你的View耦合太多了; 有在互聯網上提供的大量資源,但這裏有一些我寧願:

+0

感謝您的輸入,我會明確地通過更多的MVVM的東西,但根據我有限的知識,我們可以使用項目源的固有綁定一些數據,如綁定數據列表框,網格,所以我只想確認它會有可能綁定不同的控件instate od數據,根據我對perticuler事件的需求,我需要創建新的文本框和按鈕,並將其添加到任何UI容器(如堆棧面板)中。 – user1886702

+0

使用MVVM模式,您無法在視圖中直接從虛擬機動態添加控件。但是,您可能會添加或更改一些數據......這些數據顯示的方式不同(使用新控件)。但是你的ViewModel永遠不會知道你的用戶界面,甚至不知道你的數據是如何顯示的。 編輯:我不是很清楚,因爲我的英文不流利;如果我是你,我只需要通過一些教程和文章。嘗試從一些基礎知識(綁定,模板...)開始,不要害怕創建一個小實驗項目。如果您使用瀏覽器,您將無法有效地學習任何內容。 –

+0

感謝您的幫助Pierre-Henri Barralis – user1886702

0

我有一個用戶控件這樣做過。我有一組對象,我需要動態地在StackPanel中進行控制。你也可以用任何控件來完成它......在這個例子中,我將使用一個TextBlock。

創建與要包裹在一個堆棧面板控件的數據模板: (MYTEXT是在收集的對象的屬性...見下文)

<DataTemplate x:Key="MyTemplate"> 
    <Grid Margin="0"> 
     <StackPanel>  
     <TextBlock Text="{Binding Path=MyText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 
     </TextBlock> 
     </StackPanel> 
    </Grid> 
</DataTemplate> 

那麼關鍵是綁定使用一個ItemsControl對象的集合: (收集在你的視圖模型)

<ItemsControl 
ItemsSource="{Binding ACollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
ItemTemplate=" {StaticResource MyTemplate}" Background="Transparent"> 
</ItemsControl> 

因此,舉例來說,如果有3個項目在「ACollection」會有3周的TextBlocks彼此堆疊,如果頂部有是 5集合中會有5周的TextBlocks等

0

感謝所有您的幫助,在這裏我解決了這個問題

在視圖模型我創建FrameworkElement的類型的ObservableCollection,可容納這將是任何其他控件在運行時決定。控件可以是文本框或按鈕。

Public ObservableCollection <FrameWorkElement> Test 
{ 
     get{....} set{...} 
} 

現在,我可以添加/設置任何其他控制測試

Tets.Add(new TextBox()); Or Button , this will be decided at runtime. 

現在結合這個 「測試」 的ItemsControl。

<ItemsControl x:Name="itemsControl" ItemsSource={Biding Test}> 
</ItemsControl> 
相關問題