在HierarchicalDataTemplate中使用ObjectDataProvider

时间:2015-10-02 08:30:20

标签: c# wpf binding hierarchicaldatatemplate objectdataprovider

我想将我的班级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是不可能的!

如何将当前对象实例&#34;转换为&#34; ObjectDataProvider?

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

不,它不可能使用财产..

1 个答案:

答案 0 :(得分:0)

我现在使用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;
    }
}