![](/img/trans.png)
[英]WPF databound Datagrid change horizontal column orientation depending on data type
[英]How to load different controls depending on the databound classes type in WPF
我有一個自己解決的問題,但由於它的復雜性和許多事件的依賴性,並且不符合MVVM的准則,因此我不喜歡該解決方案,所以我想以正確的方式來做並對其進行重構。 我還要強調,這是問題的簡化示例
在一切之前,我有一個基礎課
public abstract class CommonBaseClass
{
public int ID { get; set; }
}
我也有幾個從基類繼承的類
public class DateClass : CommonBaseClass
{
public DateTime Value { get; set; }
public string Name { get; set; }
}
public class TextClass : CommonBaseClass
{
public string Value { get; set; }
}
public class TrueClass : CommonBaseClass
{
public bool Value { get; set; }
}
在用戶控件中,我有一個可觀察到的基類對象集合。
ObservableCollection<CommonBaseClass> DataCollection = new ObservableCollection<CommonBaseClass>();
集合“ DataCollection”綁定到項控件。
<ItemsControl ItemsSource="{Binding DataCollection}">
</ItemsControl>
我想以某種方式將集合綁定到itemsControl,這取決於繼承基類的類的類型,將加載不同的控件並以最大程度的自定義進行數據綁定
因此,如果控件中的項是TextClass的類型,則該對象將綁定到標簽,如果它是TrueClass的類型,則將綁定到ChackBox,如果是CateClass,則將其綁定到自定義UserControl包含DatePicker,textBox和執行某些代碼的Button。
我已經有一個可行的解決方案,但是我認為這真的很糟糕,因為它在轉換器中創建了不同的控件,並且它等待不同的加載事件並手動綁定所有內容。 正如我所說的,真的很糟糕。
我確信必須有更好的“ MVVM方法”才能在XAML中實現它。
我使用的是轉換器,模板和資源字典(也包括合並的字典),因此,我將不勝感激。
提前致謝 ;)
如果存在涉及如何基於綁定選擇正確模板的更復雜的邏輯,通常可以通過最終將DataTemplates與DataTemplateSelector結合使用來解決此問題。 對於所描述的場景,在資源中定義特定的數據模板並指定DataTemplate的DataType屬性就足夠了。 然后,WPF根據綁定對象的類型選擇正確的模板。
在MSDN上描述了技術細節
使用數據模板選擇器。 如果您需要精簡的完整示例,請參閱我對此堆棧溢出問題的回答。
我曾經通過指定ItemControl的所有三個潛在控制解決了類似的問題ItemTemplate
,並使用一個轉換器將設置Visibility
的兩個控制到Hidden
和一個Visible
基於實際數據類型。 這使您可以設置所有三個控件,包括XAML中的綁定,而無需編碼行為或事件代碼。
一個問題可能是在使用TextClass
和TrueClass
類型的情況下,DatePicker控件仍將存在於DataTemplate中(盡管不可見)並綁定到當前類型上不存在的Name
屬性-但我沒有嘗試會假定XAML足夠寬容,因此可以忽略此不適當的綁定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.