2012-05-17 58 views
1

我一直在尝试这一整天,但没有任何运气。我能够显示UserControl,但我无法弄清楚为什么列将不会显示,即使我已将它们设置在XAML中。此外,我不确定数据是否显示,因为表单空白。ListView不会在运行时更新

这是我从其他程序调用的类库的一部分。但是,它总是显示一个空白表格并且没有任何更新。

下面是我的UserControl代码。

public partial class DisplayData : UserControl 
{ 
    ObservableCollection<Data> _DataCollection = new ObservableCollection<Data>(); 

    public DisplayData() 
    { 
     InitializeComponent(); 

     Window window = new Window(); 
     window.Content = new UserControl(); 
     window.Show(); 
    } 

    public void AddDataToList(int ID, string Name) 
    { 
     _DataCollection.Add(new Data 
     { 
      StudentID = ID, 
      StudentName = Name 
     }); 
    } 

    public ObservableCollection<Data> DataCollection { get { return _DataCollection; } } 
} 

public struct Data 
{ 
    public int StudentID { get; set; } 
    public string StudentName { get; set; } 
} 

下面是如何,我叫它:

class Program 
{ 
    [STAThread] 
    static void Main(string[] args) 
    { 
     DisplayData displayData = new DisplayData(); 
     displayData.AddDataToList(2, "John"); 
     System.Threading.Thread.Sleep(5000); 
    } 
} 

而XAML:

<UserControl x:Class="ConsoleApplication1.DisplayData" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="100" d:DesignWidth="210"> 
    <StackPanel> 
     <ListView ItemsSource="{Binding DataCollection}"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Width="100" Header="ID" DisplayMemberBinding="{Binding StudentID}" /> 
        <GridViewColumn Width="100" Header="Name" DisplayMemberBinding="{Binding StudentName}" /> 
       </GridView> 
      </ListView.View> 
     </ListView> 
    </StackPanel> 
</UserControl> 

编辑 我还想补充一点:

  1. 它将不会显示我正确的大小
  2. 我甚至无法看到表格上的列标题
  3. 没有数据更新。

此外,不知道这是否有帮助,但我已经将此作为一个WPF UserControl添加到我现有的项目。

+0

也许你应该尝试创建一个新的项目(WPF之一),而不是控制台应用程序。 :) – ShadeOfGrey

回答

1

没有看到所有的代码,我不能说,如果这是问题(或唯一的问题),或者没有,但你需要绑定DataContext属性。你的列表视图知道列绑定到一些属性,但他们不知道这些属性来自哪里(类)。

你也想看看INotifyPropertyChanged(也许不适合这个项目,但一般来说)。这是有点解释,所以你可以看看它做什么,但它是WPF绑定的一个重要组成部分。

http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.datacontext.aspx

你最好此举是要找到绑定和如何建立你的ListView一个很好的教程。如果没有一些背景知识,很难真正找到答案。无论如何,这对我来说都是。希望这是有帮助的。

+1

如果您在调试器下运行程序,它应该在输出窗口中输出任何数据绑定错误。弄清楚我是什么绑定出错了。 – Andy

+0

感谢您的评论Yatrix&Andy。我确实尝试通过调试器,但我没有看到任何警告或错误。我也无法弄清楚为什么window.Content = new UserControl()也不会显示Headers。 – Vicky

0

我不是XAML亲,但在documenation他们有不同的结合文本:http://msdn.microsoft.com/en-us/library/ms750972.aspx

尝试

DisplayMemberBinding="{Binding Path=StudentID}" 
+0

感谢您的回复。我只是尝试添加路径,但表单显示没有数据。此外,表单比我设置的尺寸(200x100)大得多。不知道为什么会发生这种情况。另外,我不想充分评价上面的代码。我今天从这里学习它:http://www.switchonthecode.com/tutorials/wpf-tutorial-using-the-listview-part-1但严重卡住。 – Vicky

+0

我还想补充一点,我在Windows ListView中试图做到这一点,并且我能够更新数据(使用.Update())并正确显示它。我不知道为什么它不适用于WPF。 – Vicky

+0

@Vicky不要指望winform控件和wpf控件有相似之处,您不会感到失望。 – Yatrix

0

你有没有试图改变

public struct Data 

public class Data 

我今天也一直在使用ListView,如果有一件事我可以说它是它是挑剔的。它可能只是不想要一个结构。

编辑:这是我工作的ListView

<ListView Grid.Column="2" HorizontalAlignment="Stretch" Margin="0" Name="listTableItem" VerticalAlignment="Stretch"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Name" 
       DisplayMemberBinding="{Binding Name}" 
       Width="75" 
      /> 
      <GridViewColumn Header="Value" 
       DisplayMemberBinding="{Binding Value}" 
       Width="500" 
      /> 
     </GridView> 
    </ListView.View> 
</ListView> 
+0

David:是的,我读了你的答案并改为上课,但它仍然不起作用。1.它不会显示我正确的尺寸。2.我甚至看不到3.没有数据更新:( – Vicky

+0

)仔细查看代码后,我认为我的示例可能不起作用,因为我手动将项目添加到TreeView.Items,而您正在使用数据源。我包含了我的工作ListView代码,以便您可以进行比较。希望它至少可以帮助您排除一些问题。 – CodeSlinger512

0

我认为你需要绑定你的DataContext到代码隐藏。见下文。

<UserControl x:Class="ConsoleApplication1.DisplayData" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     DataContext="{Binding RelativeSource={RelativeSource Self}}" 
     mc:Ignorable="d" 
     d:DesignHeight="100" d:DesignWidth="210"> 
+0

figabytes:我已将您的建议并入我的XAML,但仍然没有运气。 :( – Vicky

0

至于其他的一些海报指出您需要设置的DataContext(如figabytes回答):

<UserControl x:Class="ConsoleApplication1.DisplayData" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     DataContext="{Binding RelativeSource={RelativeSource Self}}" 
     mc:Ignorable="d" 
     d:DesignHeight="100" d:DesignWidth="210"> 

另一个问题是,你没有做任何尝试,以显示控制。下图代码创建一个窗口对象,并将您创建的控件放置为内容。之后,你只需调用Show()或ShowDialog(),你就可以得到你的工作结果。

[STAThread] 
static void Main(string[] args) 
{ 
     DisplayData displayData = new DisplayData(); 
     displayData.AddDataToList(2, "John"); 

     Window window = new Window(); 
     window.Content = displayData; 

     window.ShowDialog(); 
}