【问题标题】:Data binding CollectionViewSource and GridView数据绑定 CollectionViewSource 和 GridView
【发布时间】:2014-09-15 13:15:21
【问题描述】:

我在 GridView 中显示数据时遇到问题。我似乎做错了,我找不到任何其他有关此的主题。可能我正在监督一些非常简单的事情。

我有这个网格视图:

<GridView ItemsSource="{Binding Source={StaticResource itemsViewSource}}" Width="383" Height="216"/>
<Button Content="Button" Click="Button_Click" />

我有这个 CollectionViewSource:

<Page.Resources>
    <CollectionViewSource x:Name="itemsViewSource" Source="{Binding NamesList, Mode=TwoWay}"/>
</Page.Resources>

还有这段代码:

人物类:

    public class Person : INotifyPropertyChanged {
    private string m_name;
    private string m_gender;
    public event PropertyChangedEventHandler PropertyChanged;

    public string Name {
        get {
            return m_name;
        }
        set {
            m_name = value;
            RaisePropertyChanged("Name");
        }
    }
    public string Gender {
        get {
            return m_gender;
        }
        set {
            m_gender = value;
            RaisePropertyChanged("Gender");
        }
    }
    protected void RaisePropertyChanged(string PropertyName) {
        var eventhandler = this.PropertyChanged;
        if (eventhandler != null) {
            eventhandler(this, new PropertyChangedEventArgs(PropertyName));
        }
    }
}

主页:

public sealed partial class MainPage : Page{
    public ObservableCollection<Person> NamesList {get; set;}

    public MainPage(){
        this.InitializeComponent();

        Person p = new Person();
        Person p2 = new Person();
        Person p3 = new Person();

        p.Name = "Piet";
        p.Gender = "Male";
        p2.Name = "Pietin";
        p2.Gender = "Female";
        p3.Name = "Piet de tweede";
        p3.Gender = "Male";

        NamesList = new ObservableCollection<Person>();
        NamesList.Add(p);
        NamesList.Add(p2); 
        NamesList.Add(p3);
    }

:   private void Button_Click(object sender, RoutedEventArgs e) {
        itemsViewSource.Source = NamesList;
    }
}

为什么我的 GridView 不显示任何数据或在单击按钮时不添加数据?

@edit 16:16 - 15-09-2014 如果单击后我添加以下内容,它会显示项目。但这不是它应该的样子。

itemsViewSource.Source = NamesList;

@edit 09:04 - 16-09-2014 我加了这个调试图显示绑定好,他可以找到NamesList。但是,如果我查看 itemsViewSource,它会说 Source 为空。

【问题讨论】:

    标签: c# xaml gridview windows-runtime


    【解决方案1】:

    由于您使用的是普通的List&lt;T&gt;,因此 WPF 无法知道何时添加或删除项目。

    尝试改用ObservableCollection&lt;T&gt;

    编辑:

    NamesList 需要是一个属性。 WPF 只能绑定到属性:

    public sealed partial class MainPage : Page
    {
        public ObservableCollection<Person> NamesList  { get; private set; }
    
        public MainPage(){
            this.InitializeComponent();
            Person p = new Person();
            Person p2 = new Person();
    
            p.Name = "Piet";
            p.Gender = "Male";
            p2.Name = "Pietin";
            p2.Gender = "Female";
    
            NamesList = new ObservableCollection<Person>();
            NamesList.Add(p);
            NamesList.Add(p2); 
        }
    

    【讨论】:

    • 我刚刚用 INotifyPropertyChanged 将其更改为 ObservableCollection,我将编辑问题。
    • NamesList 是一个字段而不是一个属性。 WPF 只能绑定到属性。
    • 我将它转换为属性,但它仍然没有显示。 (它是一个 Windows 8.1 商店应用程序)为什么当我将代码中的源代码设置为 NamesList 时它确实有效? (例如在我的按钮点击事件中)
    【解决方案2】:

    我找到了两个答案。

    答案 1:

    只需将此添加到

    DataContext="{Binding RelativeSource={RelativeSource Self}}
    

    答案 2:

    我必须在主页中设置 DataContext 并将其引用到一个类(在我的例子中是一个 Person 类)(在我看来这不合逻辑并且设置以下代码行更容易:

    itemsViewSource.Source = NamesList; 
    

    我做了以下改编;

    主页:

    public sealed partial class MainPage : Page{
        public MainPage(){
            this.InitializeComponent();
            DataContext = new Person();
        }
    }
    

    Person 类(添加了以下内容)(我必须将其更多地视为数据类):

        public ObservableCollection<Person> NamesList { get; set; }
        public Person() {
            Person p = new Person("Piet", "Male");
            Person p2 = new Person("Pietin", "Female");
            NamesList = new ObservableCollection<Person>();
            NamesList.Add(p);
            NamesList.Add(p2);
        }
        public Person(string Name, string Gender){
            m_name = Name;
            m_gender = Gender;
        }
    

    如果我这样设置,我可以正确使用 CollectionViewSource 的源绑定。 (之前源绑定为空。)

    <CollectionViewSource x:Name="itemsViewSource" Source="{Binding NamesList, Mode=TwoWay}"/>
    

    【讨论】:

      猜你喜欢
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-26
      • 1970-01-01
      相关资源
      最近更新 更多