2013-10-24 99 views
1

我想将一个自定义类的observablecollection绑定到一个简单的gridview。WPF中绑定类到gridview的问题

这是gridview的模板:

<ListView Name="TestGrid" Grid.Row="1" Margin="0,10,0,0" ItemsSource="{Binding Path=testlist}"> 
     <GridView> 
      <GridViewColumn DisplayMemberBinding="{Binding Path=AlertType}" Header="Alert" /> 
      <GridViewColumn DisplayMemberBinding="{Binding Path=Target}" Header="Target" /> 
      <GridViewColumn DisplayMemberBinding="{Binding Path=Message}" Header="Message" /> 
     </GridView> 
    </ListView> 

这是后面的代码:

public ObservableCollection<TestClass> testlist {get; set;} 

public MainWindow() 
{ 
     InitializeComponent(); 

     testlist = new ObservableCollection<TestClass>(); 
     testlist.Add(new TestClass("Type1","Target1","Message1")); 
     testlist.Add(new TestClass("Type2", "Target2", "Message2")); 
} 

public class TestClass 
{ 
    public string AlertType { get; set; } 
    public string Target { get; set; } 
    public string Message { get; set; } 

    public TestClass(string a, string t, string m) 
    { 
     AlertType = a; 
     Target = t; 
     Message = m; 
    } 
} 

现在,我一直在关注完全样品,我可以在互联网上找到。不幸的是,我在我的GridView中得到的唯一结果是显示以下消息的唯一行:“System.Windows.Controls.Columns.Count:3”

我在这里丢失了什么?

回答

2

更新你的XAML和后面的代码为:

  <ListView Name="TestGrid" Grid.Row="1" Margin="0,10,0,0" ItemsSource="{Binding Path=testlist}"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn DisplayMemberBinding="{Binding Path=AlertType}" Header="Alert" /> 
        <GridViewColumn DisplayMemberBinding="{Binding Path=Target}" Header="Target" /> 
        <GridViewColumn DisplayMemberBinding="{Binding Path=Message}" Header="Message" /> 
       </GridView> 
      </ListView.View> 
     </ListView> 

代码背后

public MainWindow() 
{ 
    InitializeComponent(); 

    testlist = new ObservableCollection<TestClass>(); 
    testlist.Add(new TestClass("Type1","Target1","Message1")); 
    testlist.Add(new TestClass("Type2", "Target2", "Message2")); 
    DataContext = this; 

}

+0

谢谢,这是更好,因为我现在可以看到正确的标题。但是,这两个事件不会显示,只有标题 – Marc

+0

您设置了DataContext,如答案中所示?如果是的话,当你启动你的窗口时,你是否在输出窗口中看到任何绑定错误? – Nitin

+0

我确实设置了DataContext,并且在运行窗口时没有出现任何绑定错误。 – Marc

2

你错过了在ListView中查看属性:

<ListView Name="TestGrid" Grid.Row="1" Margin="0,10,0,0" ItemsSource="{Binding Path=testlist}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn DisplayMemberBinding="{Binding Path=AlertType}" Header="Alert" /> 
      <GridViewColumn DisplayMemberBinding="{Binding Path=Target}" Header="Target" /> 
      <GridViewColumn DisplayMemberBinding="{Binding Path=Message}" Header="Message" /> 
     </GridView> 
    </ListView.View>  
</ListView> 
+0

的确,这是一个非常微不足道的错误。现在,它已被纠正,我可以看到标题,但两个出现不显示 – Marc

+0

尼斯。这解决了它。 Xaml在没有View的情况下不会显示任何错误。非常感谢 –

0

你可以试试crea将窗口的viewModel设置为窗口的datacontext。 更新您的代码背后:

public partial class MainWindow : Window 
{ 
    private ExampleViewModel m_ViewModel;  
    public MainWindow() 
    { 
     InitializeComponent(); 
     m_ViewModel = new ExampleViewModel(); 
     DataContext = m_ViewModel; 
    } 
} 


public class ExampleViewModel : INotifyPropertyChanged 
{ 
    private ObservableCollection<TestClass> m_testlist; 
    public ExampleViewModel() 
    { 
     m_testlist = new ObservableCollection<TestClass>(); 
     m_testlist.Add(new TestClass("Type1", "Target1", "Message1")); 
     m_testlist.Add(new TestClass("Type2", "Target2", "Message2")); 
    } 

    public ObservableCollection<TestClass> testlist 
    { 
     get 
     { 
      return m_testlist; 
     } 
     set 
     { 
      if (m_testlist != value) 
      { 
       m_testlist = value; 
       OnPropertyChanged("testlist"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 

    } 
} 

public class TestClass 
{ 
    public string AlertType { get; set; } 
    public string Target { get; set; } 
    public string Message { get; set; } 

    public TestClass(string a, string t, string m) 
    { 
     AlertType = a; 
     Target = t; 
     Message = m; 
    } 
}