![](/img/trans.png)
[英]How do I control a WPF 4.5 Ribbons contextual tab visibility by availability of a particular control within a Prism (+ MEF) view using MVVM?
[英]Dynamically generating controls in WPF using Prism, MVVM, MEF
我將WPF與Prism和MEF結合使用。 需要動態創建控件。 所以這是我的問題!!
據我所知,我不應該在我的代碼中使用代碼(SomeFile.xaml.cs)來保持我的代碼易於測試。 因此,代碼應實際移至ViewModel。
但是我的代碼動態生成UI控件。 我不認為ViewModel應該知道有關控件的任何信息。
那么我應該在哪里以及如何去編寫這段代碼呢? 什么是正確的方法? 希望我清楚自己!
謝謝
使用WPF / MVVM時,您的數據層就是您的應用程序( DataContext ),您可以使用Templates
方式告訴WPF如何將應用程序組件繪制到UI。
例如,假設您被賦予了動態渲染一組控件的任務。
WinForms方式可能是遍歷對象,為每個對象創建UI控件,然后將UI控件添加到屏幕。
但是,使用WPF / MVVM時,您可以創建一個代表每個對象的類( Model
),並為WPF提供要顯示的這些類的列表。
WPF可以使用許多不同的控件來繪制對象列表,但是其中最基本的控件可能是ItemsControl 。 如果您有興趣, 我在博客上有一些簡單的ItemsControl
示例。
現在即使你給WPF提供了要渲染的對象列表,並告訴它使用什么控件來渲染列表,它仍然可能不知道如何繪制對象。 通常的解決方案是包含某種XAML模板,告訴它如何繪制對象。
這是一個簡單的示例模板,用於告訴WPF如何繪制MyClassObject
類型的對象:
<DataTemplate DataType="{x:Type local:MyClassObject}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Name:" />
<TextBox Text="{Binding Name}" />
</StackPanel>
</DataTemplate>
我希望這能幫助您朝正確的方向前進:)
從我的角度來看,視圖有責任呈現viewmodel提供的數據/模型。 雖然在視圖模型中保留盡可能多的模型->視圖轉換邏輯是理想的,但控件的創建會增加添加到視圖模型的復雜性,因為可能會添加耦合或基礎結構。
雖然你可以:1)讓viewmodel直接訪問視圖,允許它直接創建控件這增加了耦合... 2)在視圖上創建一個接口來操作控件這意味着必須傳遞視圖(不是簡單地綁定)到視圖模型3)創建綁定到視圖的控件的抽象,並基於由視圖模型創建的抽象來渲染視圖。這隨着控件集的擴展增加了維護的噩夢。
我建議通過主視圖模型上的屬性公開模型(直接或包裝在微視圖模型中),然后通過xaml將其綁定到視圖上的屬性,這樣,視圖模型上的任何PropertyChanged都會向視圖發送更新。 在視圖內部使用模型信息和控件創建邏輯來清除並重新創建控件,並將模型動態綁定到您創建的控件。 這將簡化控件的創建和綁定,並且您無需練習任何伏都教即可將輸入到控件中的信息返回到模型中。
請注意,即使您創建了一個中間類(附加的行為,裝飾器或其他),它仍將需要能夠直接訪問視圖的控件結構以將生成的控件附加到可視樹,這可能會導致其他問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.