我是MVVM的新手,在下面的場景中需要幫助。如何獲取ViewModel(MVVM)中的控件句柄
我在我的視圖中添加了一個堆棧面板,現在我必須通過viewmodel動態添加一些控件到這個堆棧面板。爲此,我需要在viewmodel中使用堆棧面板。任何人都可以請我指導我如何在我的viewmodel中訪問堆棧面板。
我在其他bloge中讀過它可以通過使用Dependency屬性來完成。但我仍然無法想辦法解決這個問題。
我是MVVM的新手,在下面的場景中需要幫助。如何獲取ViewModel(MVVM)中的控件句柄
我在我的視圖中添加了一個堆棧面板,現在我必須通過viewmodel動態添加一些控件到這個堆棧面板。爲此,我需要在viewmodel中使用堆棧面板。任何人都可以請我指導我如何在我的viewmodel中訪問堆棧面板。
我在其他bloge中讀過它可以通過使用Dependency屬性來完成。但我仍然無法想辦法解決這個問題。
幾件事要先注意。 MVVM模式中ViewModel的意圖是提供與View的分離。因此,您的ViewModel應該不瞭解View本身或View中包含的控件。其次,你應該試圖做的是你的視圖綁定到你的ViewModel的屬性(瞭解你的ViewModel作爲你的視圖的DataContext)。通常,您會將控件的ItemsSource屬性綁定到ViewModel中的某個集合。但是,您會注意到StackPanel沒有實現ItemsSource依賴項屬性。相反,使用ItemsControl來代替你的StackPanel。我會建議一些關於MVVM模式和綁定機制的額外閱讀以進一步說明。
感謝您的輸入,我將明確地通過更多的MVVM的東西,但根據我有限的知識,我們可以使用項目源的固有綁定一些數據,如綁定數據列表框,網格,所以我只想確認它會可以綁定不同的控件instate od數據,根據我對perticuler事件的需求,我需要動態創建新的文本框和按鈕,並將其添加到任何UI容器中,例如堆棧面板 – user1886702
您絕對可以將控件綁定到ItemsControl。我經常靜態和動態地完成它。它有助於認爲容器可以容納內容,而不僅僅是數據。內容可以是任何東西(最典型的是某種模板)。 – Backlash
完全同意Backlash, 看來你的ViewModel和你的View耦合太多了; 有在互聯網上提供的大量資源,但這裏有一些我寧願:
感謝您的輸入,我會明確地通過更多的MVVM的東西,但根據我有限的知識,我們可以使用項目源的固有綁定一些數據,如綁定數據列表框,網格,所以我只想確認它會有可能綁定不同的控件instate od數據,根據我對perticuler事件的需求,我需要創建新的文本框和按鈕,並將其添加到任何UI容器(如堆棧面板)中。 – user1886702
使用MVVM模式,您無法在視圖中直接從虛擬機動態添加控件。但是,您可能會添加或更改一些數據......這些數據顯示的方式不同(使用新控件)。但是你的ViewModel永遠不會知道你的用戶界面,甚至不知道你的數據是如何顯示的。 編輯:我不是很清楚,因爲我的英文不流利;如果我是你,我只需要通過一些教程和文章。嘗試從一些基礎知識(綁定,模板...)開始,不要害怕創建一個小實驗項目。如果您使用瀏覽器,您將無法有效地學習任何內容。 –
感謝您的幫助Pierre-Henri Barralis – user1886702
我有一個用戶控件這樣做過。我有一組對象,我需要動態地在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等
感謝所有您的幫助,在這裏我解決了這個問題
在視圖模型我創建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>
你是什麼意思'處理'?你是指參考還是HWND? –