none
WPF_Listview中的一个让人哭笑不得的BUG. RRS feed

  • 问题

  • 发现一个wpf中listview.gridview的一个BUG。查资料,说是在sp1中已经修正,装上SP1,结果又发现一个新BUG。
    我的命怎么这么苦哇。

     

    这个BUG让人哭笑不得。
    Text="{Binding Path=Close, StringFormat=_{0:f}}" 正常
    Text="{Binding Path=Close, StringFormat={0:f}}" 编译不过

     

    因为要显示表格,所以使用了ListView中的GridView视图.开始是直接写xaml代码,因为要保留2位小数,所以用了stringformat属性.结果就出现上面的问题.直接用{0:f},编译不过.在前面随便加些字符却能正常编译和使用了.

    没办法,只好改用代码来写.

                GridViewColumn gcv_close = new GridViewColumn();
                gcv_close.Header = "现价";
                Binding bd_close = new Binding("Close");
                bd_close.StringFormat = "f";
                gcv_close.DisplayMemberBinding = bd_close;
                gv.Columns.Add(gcv_close);

    运行正常.搞定.结果正常.没想到苦难才刚刚开始.因为是列表显示的数据,所以为了用户体验,要求数字列右对齐.于是按微软官方作法,使用自定义模板,

            <DataTemplate x:Key="template_close">
                <TextBlock HorizontalAlignment="Right" Text="{Binding Path=Close,StringFormat={0:f}" />
            </DataTemplate>

    这里问题来了.如果使用xaml代码来写自定义模板.那么StringFormat这里就没办法正常编译通过.于是再次决定用代码来写模板.但是才写了几句却发现,原来微软已经废弃了使用代码书写模板的作法.也就是说现在不允许用代码来直接写模板了,查官方资料,官方建议一般情况下使用xaml书写模板,如果需要用代码的话,可以直接用xamlreader来读取xaml字符串生成模板.这两个办法都试过,都不行.

      现在只有一个笨办法,把数据源中的对应值改为string类型,在数据源中直接就存储为{f}样式的字符串.但是用这个办法,真的感觉很雷..

      新东西好是好,就是Bug太多.赶快出sp2吧.

      另外如果有哪位高人能够帮忙解决一下我的问题,不胜感激.

    2008年12月29日 15:07

答案

  • 你可以在你的代码中试一下:

    Text="{Binding Path=Close, StringFormat=F2}}"

     

    在3.5 SP1中对StringFormat做了改进。请参考

    <TextBox Text="{Binding Path=Double, StringFormat=F3}"/>

    <TextBox Text="{Binding Path=Double, StringFormat=Amount: {0:C}}"/>

    <TextBox Text="{Binding Path=Double, StringFormat=Amount: \{0:C\}}"/>

    <TextBox>

      <TextBox.Text>

        <Binding Path="Double" StringFormat="{}{0:C}"/>

      </TextBox.Text>

    </TextBox>

    显示结果如下:

    3.142

    AmountEmbarrassed3.14

    AmountEmbarrassed3.14

    $3.14

     

    2009年1月4日 6:03

全部回复

  • 楼主你好: 

          你可以使用值转换器与绑定关联的方法。你可以创建一个实现 IValueConverter 接口的类,然后实现 ConvertConvertBack 方法,值转换器可以将数据从一种类型更改为另一种类型。这种方法在绑定使用最常见。

    详细用法请看http://msdn.microsoft.com/zh-cn/library/system.windows.data.ivalueconverter.aspx

    我试着写了一些代码,希望对你有帮助。

       [ValueConversion(typeof(Decimal), typeof(string))]
        public class DecimalToStringConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                Decimal price= (Decimal)value;
                return Decimal.Round(price, 2).ToString();
            }

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

     

    In Xaml:

       <Window.Resources>
              <localBig SmileecimalToStringConverter x:Key="MyDecimalToStringConverter" />

      <Window.Resources>

     

        Text="{Binding Path=Price,Converter={StaticResource MyDecimalToStringConverter}}"

     

    你可以试一下,如果有什么问题,请继续问。

    2008年12月30日 9:04
  • 楼上这位兄台,你的办法的确可以解决问题.

    不过,感觉上面那个stringform应该是一个BUG.为什么非要在前面加个任意字符才能正常使用.好好的一个功能,就这样给废掉了.明明一个stringform就能搞定的,结果还要绕这么大个圈子才行.

    楼上的方法,和直接改用格式化后的字符串做数据源来比,不知道那个效率更高些.

    希望微软能早点儿修复这个BUG.我的需求就是一个右对齐与格式化数字而已.为什么搞这么复杂呢.

     

    最后感谢楼上的帮助.

    2009年1月2日 16:06
  • 你可以在你的代码中试一下:

    Text="{Binding Path=Close, StringFormat=F2}}"

     

    在3.5 SP1中对StringFormat做了改进。请参考

    <TextBox Text="{Binding Path=Double, StringFormat=F3}"/>

    <TextBox Text="{Binding Path=Double, StringFormat=Amount: {0:C}}"/>

    <TextBox Text="{Binding Path=Double, StringFormat=Amount: \{0:C\}}"/>

    <TextBox>

      <TextBox.Text>

        <Binding Path="Double" StringFormat="{}{0:C}"/>

      </TextBox.Text>

    </TextBox>

    显示结果如下:

    3.142

    AmountEmbarrassed3.14

    AmountEmbarrassed3.14

    $3.14

     

    2009年1月4日 6:03