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
中?
如果我理解正确的话,你的 XamlDataTree
的 DataContext
并不是你所期望的(你 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}
)。
我目前正在开发 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
中?
如果我理解正确的话,你的 XamlDataTree
的 DataContext
并不是你所期望的(你 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}
)。