2017-02-16 32 views
1

在我們的WPF應用程序中,我們有很多的固定領域的形式。現在每個表單都應該擴展,用戶可以定義自己的字段。該數據庫包含與這些用戶定義的字段,每一個標籤,類型(文本,日期,數字,...)等動態與X添加控件:名稱MVVM

我發現了很多使用的DataTemplates偉大的解決方案,有一個表問題與然而這:就不可能生成一個唯一的x:Name屬性爲每個字段(例如使用ID字段)。 我們的應用在很大程度上依賴於x:Name財產做的事情爲:顯示/隱藏字段中,設置在數字領域的口罩,移動領域,...所有這些功能是從數據庫中讀取,因此需要每場的唯一標識符。

一個解決辦法是,生成與所述代碼隱藏的x:Name(所述的Winforms方式)這些字段。 另一個解決方案是將使用x:Name的功能更改爲使用Tag屬性。

之前,我實現這些解決方案之一,我想確保有沒有更好的辦法。有沒有一種MVVM方式來動態生成帶有x:Name的字段?

編輯

似乎有一些混亂,爲什麼我需要爲我在MVVM方案領域的x:Name,所以我會用一個例子它清除掉:

一個要求我們的軟件是在我們的應用程序中每個表單字段可以設置隱藏或可見用戶。我在這裏談論數千個領域。我可以爲包含可見性狀態的每個字段創建一個屬性,並從數據庫中填充它。

相反,我創建了基於檢索的字段名稱的知名度狀態,並將其應用於附加屬性(在樣式附後)。所以,這個功能從MVVM架構單獨運行(我從來沒有使用在ViewModelx:Name)。使用附加屬性的缺點是,表單字段需要一個身份,是在我的情況下x:Name財產。

+4

如果您嚴重依賴'x:Name'屬性來執行操作,似乎您的MVVM方法可能會被破壞。在MVVM中,你通常不希望你的'ViewModel'知道'View'或直接與它交互。 (例如:請參閱此處的討論:[如何在viewmodel中使用x:name視圖](https://social.msdn.microsoft.com/Forums/vstudio/en-US/ddb357a9-0d41-467a-b997-8aaa7c3566a9/ how-to-use-xname-view-in-viewmodel?forum = wpf)) – DIF

+0

什麼樣的邏輯依賴於'x:Name'?它放在代碼後面的位置是什麼? – bit

+0

實際上,'ViewModels'從不直接使用'x:Name'。 「Attached Properties」使用它來唯一標識一個字段。例如:一個表單包含10個數字字段。用戶可以在數據庫中爲每個字段確定輸入掩碼是什麼(例如:第一個文本框爲#6.2,其餘爲#3)。在這種情況下,除了將'x:Name'存儲在數據庫中外,別無他法。 –

回答

0

是否有MVVM的方式來動態地生成一個X字段:名稱

沒有,沒有。

x:NameXAML指令,其用於在一個XAML名稱範圍唯一地標識的UI元素和產生的背襯字段來存儲在代碼隱藏類的視圖的值。

視圖模型不,不應該知道這事,它當然不應該產生這樣的元素或背襯領域,因爲這將打破一切MVVM模式是怎麼一回事。

如果你確實需要以產生用於某種原因,你的UI元素的獨特的名稱,你應該實現在視圖中的代碼隱藏此功能。

MVVM不是關於從視圖消除視圖相關的代碼,這主要是關於關注和可測試性的分離。