ComboEditor 中的 WPF 树 - Infragistics WPF 控件

WPF Tree in ComboEditor - Infragistics WPF controls

我目前正在开发 WPF .NET 4.7 应用程序,我使用 Infragistics WPF 控件版本 18。

我需要创建一个自定义 XamComboEditor,里面有一个 XamDataTree。因此一个 ComboBox 里面有一个 Tree 选择。

树选择在没有 XamComboEditor 的情况下工作正常,看起来像这样:

<iWPF:XamDataTree ItemsSource="{Binding Locations}">
    <iWPF:XamDataTree.GlobalNodeLayouts>
        <iWPF:NodeLayout Key="Locations" TargetTypeName="LocationViewModel" DisplayMemberPath="Name"/>
        <iWPF:NodeLayout Key="ChildLocations" TargetTypeName="string"/>
    </iWPF:XamDataTree.GlobalNodeLayouts>
</iWPF:XamDataTree>

我的 XamDataTree 绑定到一个可观察集合 Locations:

public ObservableCollection<LocationViewModel> Locations { get; set; } = new ObservableCollection<LocationViewModel>();

public class LocationViewModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<LocationViewModel> ChildLocations { get; set; } = new List<LocationViewModel>();
}

我需要在 XamComboEditor 上使用样式 setter 将 XamDataTree 放入组合框。

我现在的问题是,我不知道如何实现,或者如何将上下文从 XamComboEditor 进一步传递到 XamDataTree

我尝试了以下方法,但没有成功:

<iWPF:XamComboEditor ItemsSource="{Binding Locations}">
    <iWPF:XamComboEditor.ComboBoxStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <iXaml:XamDataTree ItemsSource="{Binding .}">
                            <iXaml:XamDataTree.GlobalNodeLayouts>
                                <iXaml:NodeLayout Key="Locations" TargetTypeName="LocationViewModel" DisplayMemberPath="{Binding Name}"/>
                                <iXaml:NodeLayout Key="ChildLocations" TargetTypeName="string"/>
                            </iXaml:XamDataTree.GlobalNodeLayouts>
                        </iXaml:XamDataTree>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </iWPF:XamComboEditor.ComboBoxStyle>
</iWPF:XamComboEditor>

你知道如何解决这个问题吗?您知道如何将数据上下文从父控件传递到子控件吗?或者更确切地说,如何将 XamDataTree 放在 XamComboEditor 中?

如果我理解正确的话,你的 XamlDataTreeDataContext 并不是你所期望的(你 XamComboEditor 中绑定的 Locations)。

解决此问题的一种方法是在 Binding 标记扩展中指定路径的来源。
您可以使用 {x:Reference ...} 标记扩展来引用控件树中的命名控件。

<iWPF:XamComboEditor x:Name="comboEditor" ItemsSource="{Binding Locations}">
    <iWPF:XamComboEditor.ComboBoxStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <iXaml:XamDataTree ItemsSource="{Binding Source={x:Reference Name=comboEditor}, Path=DataContext.Locations}">
                            <iXaml:XamDataTree.GlobalNodeLayouts>
                                <iXaml:NodeLayout Key="Locations" TargetTypeName="LocationViewModel" DisplayMemberPath="{Binding Name}"/>
                                <iXaml:NodeLayout Key="ChildLocations" TargetTypeName="string"/>
                            </iXaml:XamDataTree.GlobalNodeLayouts>
                        </iXaml:XamDataTree>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </iWPF:XamComboEditor.ComboBoxStyle>
</iWPF:XamComboEditor>

您也可以在不使用绑定中的 RelativeSource 属性 命名控件的情况下实现此目的(类似于 RelativeSource={RelativeSource AncestorType=iWPF:XamComboEditor})。