簡體   English   中英

如何根據WPF中的數據綁定類類型加載不同的控件

[英]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中的綁定,而無需編碼行為或事件代碼。

一個問題可能是在使用TextClassTrueClass類型的情況下,DatePicker控件仍將存在於DataTemplate中(盡管不可見)並綁定到當前類型上不存在的Name屬性-但我沒有嘗試會假定XAML足夠寬容,因此可以忽略此不適當的綁定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM