[英]WPF Tree in ComboEditor - Infragistics WPF controls
我目前正在开发 WPF .NET 4.7 应用程序,我使用 Infragistics WPF 控件版本 18。
我需要创建一个自定义XamComboEditor
,其中包含一个XamDataTree
。 因此一个 ComboBox 里面有一个树选择。
树选择在没有 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
上的样式设置器将XamDataTree
放在组合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>
您也可以在不使用 Binding 中的RelativeSource
属性命名控件的情况下实现此目的(类似于RelativeSource={RelativeSource AncestorType=iWPF:XamComboEditor}
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.