数据绑定到图像源WPF的问题

时间:2009-11-18 13:51:37

标签: wpf image data-binding listview

我在数据绑定到Image的源属性方面遇到了一些问题。

我有ListView模板

<Style x:Key="ListViewStyle" TargetType="{x:Type ListView}">
    <Setter Property="HorizontalContentAlignment" Value="Center"/>
    <Setter Property="Background" Value="Transparent" />
    <Setter Property="BorderThickness" Value="0" />
    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate x:Key="ListViewItemTemplate">
                <StackPanel Width="60"  Margin="5,5,10,5">
                    <Image Height="40" Width="40" Source="{Binding XPath=@Image}"
                           HorizontalAlignment="Center"/>
                    <TextBlock Text="{Binding XPath=@Name}" TextAlignment="Center"
                               TextWrapping="Wrap" FontWeight="bold"
                               HorizontalAlignment="Center" Margin="0,0,0,1" />
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

Style在资源字典文件中定义,该文件在app.xaml中添加。 (因此可以在任何地方访问)。

现在我有一个窗口,我已将此样式用于ListVew。 在WindowResources中,我创建了一个xmldatasource提供程序:

<XmlDataProvider x:Key="MyData" XPath="/Reports">
    <x:XData>
        <Reports xmlns="">
            <Item Name = "Item1" Image="Resources\MenuIcons\Pic1.png"/>
            <Item Name = "Item2" Image="Resources\MenuIcons\Pic2.png"/>
            <Item Name = "Item3"  Image="Resources\MenuIcons\Pic3.png"/>
        </Reports>
    </x:XData>
</XmlDataProvider>

我已将此数据源指定为ItemsSource的{​​{1}}:

Listview

我的问题是,当我运行应用程序<ListView Name="MyListView" Style="{DynamicResource ListViewStyle}" ItemTemplate="{StaticResource ListViewItemTemplate}" ItemsSource="{Binding Source={StaticResource MyData},XPath=Item}"/> 时,文本正在显示,但ListViewItem丢失..

但是当我在Window.Resource 中定义了这个Image 并使用Style作为StaticResource而不是Dynamic Resource时,一切正常。

任何人都可以告诉我没有放弃Style的原因吗?我想全局使用这种风格(所以我需要在ResourceDictionary中定义它)。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

我认为没有人回答你的问题,因为我们看不出任何错误。

我决定尝试重现您的问题,但即使我尝试按照您的重复步骤操作,您的代码也能正常运行。

以下是我的步骤:

  1. 创建了一个空白的WPF应用程序
  2. 添加了ResouceDictionary文件 Dictionary1.xaml
  3. <Style>代码粘贴到<ResourceDictionary>代码
  4. 内的Dictionary1.xaml中
  5. 编辑了在DataTemplate上设置x:Key的错字
  6. <Window.Resources>元素添加到 Window1.xaml
  7. 的顶部
  8. 将您的<XmlDataProvider>代码粘贴到<Window.Resources>代码
  9. 替换了图片路径名,例如Image="Resources\MenuIcons\Pic1.jpg"变为Image="TestImage.jpg"
  10. 将您的<ListView>代码粘贴到<Grid>代码
  11. 删除了您的虚假ItemTemplate值,假设这是旧代码遗留下来的
  12. 将字典“Dictionary1.xaml”合并到 App.xaml
  13. 中的应用程序字典中

    以下是App.xaml的相关标记:

    <Application
       ...>
    
      <Application.Resources>
        <ResourceDictionary>
    
          <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Dictionary1.xaml" />
          </ResourceDictionary.MergedDictionaries>
    
        </ResourceDictionary>
      </Application.Resources>
    
    </Application>
    

    当我运行应用程序时,我看到一个ListBox包含下面带有文本的图像。

    此时我建议您尝试重现我的步骤,看看您的示例是否有效。如果是这样,请尝试慢慢改变,就像你的应用程序无法正常工作。在某些时候,您将发现有关您的应用程序的不同之处。那么也许我们可以给你一些更好的建议来解决它。

答案 1 :(得分:0)

嗯..我发现了问题...问题是我的样式字典文件和图像在项目目录中的2个单独的目录中。我在样式目录中保存了所有字典文件,在资源目录中保存了样式目录之外的所有图像。 所以我需要将xml中的Image路径更改为

<XmlDataProvider x:Key="MyData" XPath="/Reports">
            <x:XData>
                <Reports xmlns="">
                    <Item Name = "Item1" Image="..\Resources\MenuIcons\Pic1.png"/>
                    <Item Name = "Item2" Image="..\Resources\MenuIcons\Pic2.png"/>
                    <Item Name = "Item3"  Image="..\Resources\MenuIcons\Pic3.png"/>
                </Reports>
            </x:XData>
        </XmlDataProvider>

(我应该添加.. \前路径)这解决了我的问题..感谢Ray Burns的回复.. - Sasikumar D.R. 0