none
GridView DisplayMemberBinding不能用 RRS feed

  • 问题

  • <ListView Name="BackupList" SelectionChanged="SelectedItemChanged" x:FieldModifier="private"
              ItemsSource="{Binding Backups, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}">
        <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn Header="{StaticResource BackupName}" DisplayMemberBinding="{Binding Name}" />
                    <GridViewColumn Header="{StaticResource BackupTime}" DisplayMemberBinding="{Binding Time}" />
                    <GridViewColumn Header="{StaticResource BackupSize}" DisplayMemberBinding="{Binding Size}" />
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>
    

    上面是WPF代码,下面是后台代码:

    private readonly ObservableCollection<Backup> backups = new ObservableCollection<Backup>();
    public IEnumerable<Backup> Backups { get { return backups; } }
    

    生成代码略,下面是Backup类代码:

    public class Backup
    {
        public Backup(FileInfo info)
        {
            Info = info;
        }
        public FileInfo Info { get; private set; }
        public string Name
        {
            get
            {
                return Info.Name.Substring(0, Info.Name.Length - R.BackupExtension.Length).Replace("%1", "\\").Replace("%2", "/"
                    .Replace("%3", ":").Replace("%4", "*").Replace("%5", "?").Replace("%6", "\"").Replace("%7", "<").Replace("%8
                    .Replace("%9", "|").Replace("%0", "%");
            }
            set
            {
                // ReSharper disable PossibleNullReferenceException
                Info.MoveTo(Path.Combine(Info.Directory.FullName, value + R.BackupExtension));
                // ReSharper restore PossibleNullReferenceException
            }
        }
        public string Time { get { return Info.LastWriteTime.ToString(); } }
        public string Size { get { return Helper.GetSize(Info.Length); } }
        public static string GetFileName(string backupName)
        {
            return backupName.Replace("%", "%0").Replace("\\", "%1").Replace("/", "%2").Replace(":", "%3").Replace("*", "%4")
                .Replace("?", "%5").Replace("\"", "%6").Replace("<", "%7").Replace(">", "%8").Replace("|", "%9");
        }
    }
    

    这样进行后上面三列(Header)显示正常,而下面的几行,每行只有一列,全部显示Mygod.WorldOfGoo.Modifier.UI.Backup,这是什么问题?

    2012年5月1日 2:33

答案

全部回复

  • 我这边无法完整地测试你的代码,所以把你那些逻辑又做了初步省略,只保留绑定的属性及基本结构,结果是很正常,能够显示数据,下面是我测试的代码。

        <ListView Name="BackupList" SelectionChanged="SelectionChanged" x:FieldModifier="private"
              ItemsSource="{Binding Backups, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}">
          <ListView.View>
            <GridView>
              <GridView.Columns>
                <GridViewColumn Header="BackupName" DisplayMemberBinding="{Binding Name}" />
                <GridViewColumn Header="BackupTime" DisplayMemberBinding="{Binding Time}" />
                <GridViewColumn Header="BackupSize" DisplayMemberBinding="{Binding Size}" />
              </GridView.Columns>
            </GridView>
          </ListView.View>
        </ListView>

    C#:

      public partial class MainWindow : Window
      {
        private readonly ObservableCollection<Backup> backups = new ObservableCollection<Backup>();
        public IEnumerable<Backup> Backups { get { return backups; } }
        public MainWindow()
        {
          InitializeComponent();
          backups.Add(new Backup());
          backups.Add(new Backup());
          backups.Add(new Backup());
        }
    
        private void SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
    
        }
      }
    
      public class Backup
      {
        public string Name
        {
          get
          {
            return "name";
          }
        }
        public string Time { get { return "time"; } }
        public string Size { get { return "size"; } }
      }

    所以,你可以和我一样,省略点复杂的逻辑,一步步做排除法。去找到问题根源。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us


    2012年5月2日 5:15
    版主
  • 好的,我试试。

    不过我昨天把ListView改成DataGrid一切正常,但是改回来时又不正常了,所以我怀疑不是我的代码逻辑问题。(而且之前可以用,后来不知怎么就不能用了)

    2012年5月2日 11:37
  • 试了一下还是不行,把Name, Time, Size改成找你那样还是完全不行,调试时断点根本没有命中!
    2012年5月3日 11:11
  • 我找到问题了,我重写了ListViewItem的样式!问题解决。
    2012年5月3日 11:24