[英]WPF, TreeView, Bind to properties inside object in Collection
這可能並不難,但是我越來越困惑。
我想在我的視圖中顯示一個TreeView,但是我無法正確獲得數據綁定。
TemplateFamilyList集合是根對象。 它將包含TemplateFamily對象的列表。 每個TemplateFamily對象將包含一個Template對象和一個TemplateParameter對象列表,稱為TemplateParameterMembers。 實際的Template類和實際的TemplateParameter類都具有Name屬性以及其他屬性。
因此,在我的ViewModel類中,我有一個填充集合的方法:
public void LoadTemplateTree()
{
TemplateFamilyList = new ObservableCollection<TemplateFamily>();
List<Template> templateList = BuilderService.GetAllTemplates();
List<TemplateParameter> templatesParametersList;
foreach (Template template in templateList)
{
templatesParametersList = BuilderService.GetATemplatesParameters(template.TemplateID);
TemplateFamilyList.Add(new TemplateFamily(template, new ObservableCollection<TemplateParameter>(templatesParametersList)));
}
}
這是TemplateFamily類:
public class TemplateFamily
{
public Template Template { get; set; }
public ObservableCollection<TemplateParameter> TemplateParameterMembers { get; set; }
public TemplateFamily(Template aTemplate, ObservableCollection<TemplateParameter> templatesParameters)
{
Template = aTemplate;
TemplateParameterMembers = templatesParameters;
}
}
我想要的是一個TreeView,例如:
NameOfTemplateB
等等
在我的XAML中,我有以下內容:(但無法正常工作,它只給出了箭頭但沒有名稱,卻給出了一些空白的樹狀視圖)。
<TabItem Header="Template Files" Height="22" VerticalAlignment="Top">
<TreeView Height="Auto" Name="treeView1" Width="Auto" ItemsSource="{Binding TemplateFamilyList}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding TemplateParameterMembers}" >
<TextBlock Text="{Binding Path=Name}" Margin="2" ></TextBlock>
</HierarchicalDataTemplate >
</TreeView.ItemTemplate>
</TreeView>
</TabItem>
ViewModel通過ViewModelLocator綁定到視圖,在其他情況下也可以正常工作。 我知道如果綁定到TemplateFamilyList,它將得到正確的對象,我只是不知道如何在該列表中顯示每個TemplateFamily的名稱(應該是TemplateFamily對象的Template屬性的Name屬性),並且然后對於樹中的下一個級別(如果存在TemplateParameterMembers列表),如何顯示TemplateParameterMembers集合中每個項目的TemplateParameter屬性的Name屬性。
我想我可以嘗試在TemplateFamily類中具有另一個屬性Name,並在構造函數中簡單地復制Template的Name屬性,例如:
public TemplateFamily(Template aTemplate, ObservableCollection<TemplateParameter> templatesParameters)
{
Template = aTemplate;
Name = aTemplate.Name;
TemplateParameterMembers = templatesParameters;
}
但是我不喜歡這種方法,此外,我沒有用於收集TemplateParameters的特殊“容器”類,因此,我仍然需要以某種方式向下鑽取並獲取TemplateParameters中每個項目的Name屬性TemplateParameterMembers集合。
我看到了這篇文章 ,似乎在答案中,Gishu使用了DataType屬性,例如:
DataType="{x:Type local:Group}
OP帖子中定義的本地名稱空間為:
xmlns:local="clr-namespace:TaskManager.Domain;assembly=TaskManager.Domain"
但是,就我而言,Template和TemplateParameter類是我模型的一部分,它們甚至與ViewModel和View不在同一個項目中。 就我的本地名稱空間而言,我有這個:
xmlns:local="clr-namespace:S.VisualStudioExtension"
local:ViewModelLocator.AutoWireViewModel="True"
然后,我應該為Template和TemplateParameter類添加一個名稱空間,例如:
xmlns:domain="clr-namespace:S.ModelDomain"
並嘗試在DataType屬性中使用它?
我還懷疑我的XAML出了點問題,也許我應該擁有另一個Hierarchical DataTemplate?
在這種情況下,最好,最通用的解決方案是為將在樹中顯示的每種類型的項目定義一個模板,並將其放入樹的資源字典中。 每個模板都應使用DataType
屬性與相應的項目類型相關聯。 這樣,將自動選擇合適的模板以根據其類型顯示每個項目。 假設您的TemplateParameter
類是在名稱空間S.ModelDomain
名為S.ModelDomain
的項目中定義的,並且local
前綴已在您的XAML中正確定義,那么這應該會給您帶來預期的結果( 我剝奪了刪除不相關屬性的XAML的自由 ):
<TreeView xmlns:models="clr-namespace:S.ModelDomain;assembly=S.ModelDomain"
ItemsSource="{Binding TemplateFamilyList}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:TemplateFamily}"
ItemsSource="{Binding TemplateParameterMembers}" >
<TextBlock Text="{Binding Template.Name}" />
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type models:TemplateParameter}">
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</TreeView.Resources>
</TreeView>
盡管在XAML的根元素(通常是Window
或UserControl
)上定義名稱空間映射是很常見的做法。 在此處查看更多信息: WPF XAML的XAML命名空間和命名空間映射 。
請注意,盡管模板被放置在資源字典中,但並未指定x:Key
參數。 在自動模板選擇過程中需要考慮模板。 這種模板稱為隱式模板 。 這是一個有用的鏈接: 數據模板概述 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.