如果你想弄清楚如何給孩子QueueHierarchy
項目不同的模板比他們的父母,HierarchicalDataTemplate.ItemTemplate
應該做的工作:
<TreeView
ItemsSource="{Binding ElementName=MainWindowName, Path=QueueHierarchy.Children}"
>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<!-- Blue bkg only to show that it's a different template -->
<TextBlock Background="SkyBlue" Text="{Binding QueueID}" />
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
<TextBlock Text="{Binding QueueID}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
如果層次是任意的深度,你可以讓孩子模板也是分層的。如果HierarchicalDataTemplate
沒有ItemTemplate
集合,它將無限期地用於其子女,兒童的孩子等。
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<TextBlock Text="{Binding QueueID}" />
</HierarchicalDataTemplate>
您也可以給子模板自己的子模板。
如果您希望您的根集合項目是樹中的項目,我可以考慮幾個選項。
您可以編寫一個便宜且令人愉快的值轉換器,它接受任何給定的對象並返回僅包含該對象的集合。
public class EnumerateConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return new List<object> { value };
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
XAML:
<TreeView
ItemsSource="{Binding ElementName=MainWindowName, Path=QueueHierarchy, Converter={StaticResource EnumerateConverter}}"
>
或者這會工作:
private QueueHierarchy _qh;
public QueueHierarchy QueueHierarchy {
get { return _qh; }
set {
if (_qh != value) {
_qh = value;
OnPropertyChanged(nameof(QueueHierarchy));
OnPropertyChanged(nameof(QueueHierarchyRootLevel));
}
}
public IEnumerable<QueueHierarchy> QueueHierarchyRootLevel {
get { yield return QueueHierarchy; }
}
或者給QueueHierarchy
返回相同的枚舉屬性:
public IEnumerable<QueueHierarchy> CollectionOfSelf {
get { yield return this; }
}
XAML:
<TreeView
ItemsSource="{Binding ElementName=MainWindowName, Path=QueueHierarchy.CollectionOfSelf}"
>
我開始認爲價值轉換器的想法是最「正確的MVVM」方法。你不希望你的viewmodels擔心這個問題。這真的是一個視角,轉換器將解決方法限制在視圖區域。
「TreeView」的「ItemsSource」中的「Path = QueueHierarchy」綁定到單個項目。這是不對的,是嗎?這不是一個集合。 – mariocatch
我想知道這件事。這是一個簡單的解決方法,請參閱更新中的'ItemsSource'綁定。 –
這不包括根項目,但它恰好適用於我需要的內容(儘管可能不適用於其他人)。 – mariocatch