在 HierarchicalDataTemplate 中使用 ObjectDataProvider

Using ObjectDataProvider inside HierarchicalDataTemplate

我想将 class treeviewitem 的项目添加到 TreeView。

并且我想将此 TreeViewItem 的 ItemSource 绑定到其自身的方法!

我正尝试为此使用 ObjectDataProvider。请参阅我的 XAML:

<Grid Background="#FFE5E5E5">
    <Grid.Resources>
        <HierarchicalDataTemplate DataType="{x:Type myNs:treeviewitem}">
            <HierarchicalDataTemplate.Resources>
                <ObjectDataProvider x:Key="getItems"
                                    MethodName="GetItems"
                                    ObjectInstance="{Binding RelativeSource={RelativeSource Self}}" />
            </HierarchicalDataTemplate.Resources>
            <HierarchicalDataTemplate.ItemsSource>
                <Binding Source="{StaticResource getItems}" />
            </HierarchicalDataTemplate.ItemsSource>
            <StackPanel Orientation="Horizontal">
                <TextBlock Margin="5,0,0,0"
                           Text="{Binding Name}" />
            </StackPanel>
        </HierarchicalDataTemplate>
    </Grid.Resources>
    <TreeView x:Name="guiTreeview"
              HorizontalAlignment="Left"
              Width="200" />
</Grid>

但是绑定到 ObjectInstance 是不可能的!

如何获取当前对象实例 "into" ObjectDataProvider?

这样做的正确方法是什么?

而且不,它不可能使用 属性 ..

我现在已经用 ValueConverter 完成了。

XAML:

<Grid Background="#FFE5E5E5">
    <Grid.Resources>
        <HierarchicalDataTemplate DataType="{x:Type myNs:MyItem}" ItemsSource="{Binding RelativeSource={RelativeSource Self}, Converter={myNs:GetItemsConverter}}" >
            <StackPanel Orientation="Horizontal">
                <TextBlock Margin="5,0,0,0" Text="{Binding Name}" />
            </StackPanel>
        </HierarchicalDataTemplate>

    </Grid.Resources>
    <TreeView x:Name="guiTreeview" HorizontalAlignment="Left" Width="200" />

</Grid>

转换器:

public abstract class BaseConverter : MarkupExtension
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}

public class GetItemsConverter : BaseConverter, IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var tvi = value as TreeViewItem;
        if (tvi == null) return null;

        var myitem = tvi.DataContext as MyItem;
        if (myitem == null) return null;

        return myitem.GetItems();
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }
}