none
Binding 的 Path 中组合一些字串 RRS feed

  • 问题

  • xml data:    (C:\afx.xml)
    <Root>
      <Child Name="ChildA" Icon="afx.ico"/>
      <Child Name="ChildB" Icon="wmp.ico"/>
      <Child Name="ChildC" Icon="ffx.ico"/>
    </Root>

    在 xaml:
    <XmlDataProvider x:Key="dataprov" Source="C:\afx.xml" XPath="Root/Child"/>

    <ItemsControl ItemsSource="{Binding Source={StaticResource dataprov}}">
    
        <ItemsControl.ItemTemplate>
    
            <DataTemplate>
    
                <DockPanel>
    
                     <Image Stretch="None" Source="{Binding XPath=@Icon, StringFormat=Images/{0}}"/>
    
                     <TextBlock Text="{Binding XPath=@Name}"/>
    
                </DockPanel>
    
            </DataTemplate>
    
        </ItemsControl.ItemTemplate>
    
    </ItemsControl>
    
    


    图片已经置入项目 根目录/Images 下. 但显示不了. Why?

    如果改为
    <ItemsControl ItemsSource="{Binding Source={StaticResource dataprov}}">
    
        <ItemsControl.ItemTemplate>
    
            <DataTemplate>
    
                <DockPanel>
    
                     <TextBlock Text="{Binding XPath=@Icon, StringFormat=Images/{0}}" Visibility="Collapsed" Name="icoPath"/>
    
                     <Image Stretch="None" Source="{Binding ElementName=icoPath, Path=Text}"/>
    
                     <TextBlock Text="{Binding XPath=@Name}"/>
    
                </DockPanel>
    
            </DataTemplate>
    
        </ItemsControl.ItemTemplate>
    
    </ItemsControl>
    
    

    则正常显示.

    直接使用 StringFormat 组合出的 string 作为 image 的 source 显示不了,必须使用 间接方法 或者 Converter 吗?
    有没有直接方法?

    Thanks
    Hello, everyone
    2009年11月8日 21:07

答案

  • image 的source转换的对象是bitmapimage类型 不是字符串 那么StringFormat无法用在image的source上 因为转换后 才用Stringfomat应用格式 这时候无效了
    解决方法需要转换类型逻辑
     public  class imageconvert:IValueConverter
        {
            #region IValueConverter 成员

            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                string p = System.IO.Path.Combine("Images/", value.ToString());
                return new System.Windows.Media.Imaging.BitmapImage(new Uri(p, UriKind.RelativeOrAbsolute));
            }

            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotImplementedException();
            }

            #endregion
        }


    <Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:i="clr-namespace:WpfApplication1"    Title="Window1" Height="300" Width="300" Topmost="False" WindowStyle="SingleBorderWindow" >
        <Window.Resources>
            <i:imageconvert x:Key="imageconver"></i:imageconvert>
                <XmlDataProvider x:Key="p" XPath="/images/*" >
                <x:XData>
                    <images xmlns="" >
            
                        <imagea names="122222" imagepath="Desert.jpg"></imagea>
                        <imagea names="111112" imagepath="Jellyfish.jpg"></imagea>
                    </images>
                </x:XData>

            </XmlDataProvider>
        
        </Window.Resources>
        <Grid Name="g1">

            <ItemsControl  ItemsSource="{Binding Source={StaticResource p}}" Margin="46,0,73,30">
                <ItemsControl.ItemTemplate>

                    <DataTemplate>

                        <DockPanel>
            <TextBlock Text="{Binding XPath=@names}" Margin="10" />
            <Image    Source="{Binding XPath=@imagepath,Converter={StaticResource imageconver}  }" Width="100" Height="100" />
        
                        </DockPanel>

                    </DataTemplate>

                </ItemsControl.ItemTemplate>


            </ItemsControl>
        </Grid>
    </Window>

    • 已标记为答案 Yeshirow 2009年12月18日 20:15
    2009年11月9日 14:22