【问题标题】:Issue with binding class to gridview in WPFWPF中将类绑定到gridview的问题
【发布时间】:2013-11-02 21:18:45
【问题描述】:

我正在尝试将自定义类的 observablecollection 绑定到简单的 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"

我在这里错过了什么?

【问题讨论】:

    标签: wpf listview gridview binding


    【解决方案1】:

    您可以尝试为窗口创建 viewModel 并将其设置为窗口的数据上下文。 更新你的代码:

     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;
        }
    }
    

    【讨论】:

      【解决方案2】:

      您缺少 ListView 上的 View 属性:

      <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>
      

      【讨论】:

      • 确实,这是一个非常微不足道的错误。现在更正了,我可以看到标题,但是没有显示两次出现
      • 不错。这解决了它。 Xaml 在没有视图的情况下没有显示任何错误。非常感谢
      【解决方案3】:

      将您的 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;
      

      }

      【讨论】:

      • 谢谢,这好多了,因为我现在可以看到正确的标题了。但是,没有显示两次出现,只有标题
      • 您是否设置了答案中显示的DataContext?如果是的话..当您启动窗口时,您是否在输出窗口中遇到任何绑定错误?
      • 我确实设置了DataContext,并且在运行窗口时没有遇到任何绑定错误。
      • 好的,现在终于可以使用了。我重新启动了项目,现在一切正常。谢谢!
      猜你喜欢
      • 2013-10-11
      • 1970-01-01
      • 2016-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-03
      相关资源
      最近更新 更多