gpt4 book ai didi

wpf - 使用带有 HierarchicalDataTemplate 的 CollectionViewSource

转载 作者:行者123 更新时间:2023-12-02 11:22:24 25 4
gpt4 key购买 nike

您将如何将 CollectionViewSource(提供排序行为)与 HierarchicalDataTemplate 的 ItemsSource 结合使用?

因此,鉴于下面的代码,我如何对层次结构中每个级别的子级应用排序?

<HierarchicalDataTemplate DataType="{x:Type l:CommandGroup}"
ItemsSource="{Binding Children}">
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}"
BasedOn="{StaticResource {x:Type MenuItem}}">
<Setter Property="Command"
Value="{Binding Command}" />
<Setter Property="CommandParameter"
Value="{Binding}" />
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>

我认为我可能已经能够执行以下操作,但它会破坏后代的显示以及产生以下绑定(bind)错误。
<HierarchicalDataTemplate DataType="{x:Type l:CommandGroup}">
<HierarchicalDataTemplate.ItemsSource>
<Binding>
<Binding.Source>
<CollectionViewSource Source="{Binding Children}" />
</Binding.Source>
</Binding>
</HierarchicalDataTemplate.ItemsSource>
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}"
BasedOn="{StaticResource {x:Type MenuItem}}">
<Setter Property="Command"
Value="{Binding Command}" />
<Setter Property="CommandParameter"
Value="{Binding}" />
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Children; DataItem=null; target element is 'CollectionViewSource' (HashCode=5114324); target property is 'Source' (type 'Object')

编辑:我最终得到以下结果-希望对其他人有所帮助
 <Window.Resources>
<l:SortedCollectionViewSource x:Key="SortedCollectionViewSource" Property="Name"/>
</Window.Resources>

<Window.ContextMenu>
<ContextMenu>
<MenuItem Header="Add new item..."
ItemsSource="{Binding AddNewItem.Children, Converter={StaticResource SortedCollectionViewSource}}">
<MenuItem.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type l:CommandGroup}"
ItemsSource="{Binding Children, Converter={StaticResource SortedCollectionViewSource}}">
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}"
BasedOn="{StaticResource {x:Type MenuItem}}">
<Setter Property="Command"
Value="{Binding Command}" />
<Setter Property="CommandParameter"
Value="{Binding}" />
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
</MenuItem.ItemTemplate>
</MenuItem>
</ContextMenu>
</Window.ContextMenu>

public class SortedCollectionViewSource : IValueConverter
{
public string Property { get; set; }

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var cvs = new CollectionViewSource() { Source = value };
cvs.SortDescriptions.Add(new SortDescription(Property, ListSortDirection.Ascending));

return cvs.View;
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}

最佳答案

正如错误所说 CollectionViewSource不是 FrameworkElement元素,因此绑定(bind)将无法解析属性值。

作为一种解决方案,您可以在 View 模型中拥有相同的只读属性并将其绑定(bind)到 HierarchicalDataTemplate.ItemsSource
例如

    public CollectionViewSource MyCollectionView
{
get { return new CollectionViewSource() { Source = Children }; }
}

并将其绑定(bind)为
    <HierarchicalDataTemplate DataType="{x:Type l:CommandGroup}"
ItemsSource="{Binding MyCollectionView}">

CollectionViewSource 是 xaml 可以正常绑定(bind)到静态/动态资源或静态属性,其他绑定(bind)总是有问题,因为 CollectionViewSource 不传递 DataContext

作为尝试,您可以尝试,但不确定是否有效
<HierarchicalDataTemplate x:name="hTemplate" DataType="{x:Type l:CommandGroup}">
<HierarchicalDataTemplate.ItemsSource>
<CollectionViewSource Source="{Binding DataContext.Children,ElementName=hTemplate}" />

如上所述抛出异常尝试这个,如果 CollectionViewSource 能够解析正确的源集合,这可能会起作用
<HierarchicalDataTemplate x:name="hTemplate" DataType="{x:Type l:CommandGroup}">
<HierarchicalDataTemplate.ItemsSource>
<Binding>
<Binding.Source>
<CollectionViewSource Source="{Binding DataContext.Children,ElementName=hTemplate}" />

关于wpf - 使用带有 HierarchicalDataTemplate 的 CollectionViewSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25127506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com