1

我有TreeView我绑定到我的数据类列表。实际上,我正在使用 JSON 数据并从中创建列表。另外,我定义 a DataTemplateinTreeView来保存一个Imageand TextBlockin StackPanel。但是当我运行项目时,它只显示我需要的文本,而不是图像。然后我用声明/定义将DataTemplatefrom转移TreeView.ItemTemplate到,现在它什么也没显示。我开始得到UserControl.ResourcesDataType

System.Windows.Data Error: 40 : BindingExpression path error: 'IconImage' property not found on 'object' ''TVDataStructure' (HashCode=32882480)'. BindingExpression:Path=IconImage; DataItem='TVDataStructure' (HashCode=32882480); target element is 'Image' (Name=''); target property is 'Source' (type 'ImageSource')

TVDataStructurehasIconImageHeader命名的公共属性,我相信当我转移DataTemplateTreeView.ItemTemplate即使那样时它也没有正确绑定,而只是将名称显示为我的DataStructurehas Header,这与TreeViewItem'sHeader 对象相同。

XAML 代码

 <UserControl.Resources>
    <DataTemplate x:Name="TVIDataTemplate" DataType="{x:Type sotc:TVDataStructure}" >
        <StackPanel Orientation="Horizontal">
            <Image Name="IconHolder" Source="{Binding Path=IconImage}"/>
            <TextBlock Name="LabelHolder" Text="{Binding Path=Header}"/>
        </StackPanel>
    </DataTemplate>
</UserControl.Resources>
<Grid>
    <TreeView x:Name="tvMain" Height="Auto" Width="Auto" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" />
</Grid>

在后面的代码中,我只是这样做

 treeView_Expand(sender, e) {
   ...
   t.ItemsSource = ds;
 }

我只是调用 JSON 字符串,在其上运行 foreach,做一些数学运算并创建列表,然后将 (ds) 分配给 ItemsSource。

按需编辑

public class TVDataStructure
{
    public string Header;
    public object Tag;
    public ImageSource IconImage;
    public bool DoEvent = false;

    public override string ToString()
    {
        return Header;
    }
}

谢谢你的帮助。

4

1 回答 1

1

您需要使您的公共字段属性,例如

public string Header { get, set; }

就是这样...

而且,作为附带信息,文本在您的一个版本中正确显示,因为当没有找到模板时,WPF 会自动创建一个 TextBlock,其中ToString()显示返回的字符串。

通过再次显式设置树来重建您的代码ItemTemplate

于 2013-05-22T12:47:19.883 回答