none
刷新 listview RRS feed

  • 问题

  •  MyCityItemListView.ItemsSource = GlobalCenter.g_loveCityData.Collection; 我右边数据变化了, 怎么刷新 listview 控件呢
    2012年6月22日 6:57

答案

  • 操作ObservableCollection很简单,并有没针对这一功能的例子。

    从你的代码来看,你完全可以直接继承 ObservableCollection, 而不用去自己实现 IEnumerable:

        public class MyLoveCityItem : System.ComponentModel.INotifyPropertyChanged
        {
            public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
            protected virtual void OnPropertyChanged(string propertyName)
            {
                if (this.PropertyChanged != null)
                    this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
            private string _loveCity = string.Empty;
            public string LoveCity
            {
                get { return this._loveCity; }
                set
                {
                    if (this._loveCity != value)
                    {
                        this._loveCity = value;
                        this.OnPropertyChanged("LoveCity");
                    }
                }
            }
        }
        public class LoveCityCollection : System.Collections.ObjectModel.ObservableCollection<MyLoveCityItem>
        {
        }
        public class MyLoveCityData
        {
            private LoveCityCollection _Collection = new LoveCityCollection();
            public LoveCityCollection Collection
            {
                get
                {
                    return this._Collection;
                }
            }
        }

    我们可以直接实例化MyLoveCityData,然后将其作为页面的数据上下文提供数据绑定:

            MyLoveCityData data = new MyLoveCityData();
            public MainPage()
            {
                this.InitializeComponent();
                this.DataContext = data;
            }

    前面界面可以简单设计一个ListView进行显示:

        <StackPanel Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
            <Button Content="Add" Click="Button_Click_1"/>
            <Button Content="Modify" Click="Button_Click_2"/>
            <ListView ItemsSource="{Binding Collection}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding LoveCity}"/>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </StackPanel>

    两个按钮事件如下:

            private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                data.Collection.Add(new MyLoveCityItem() { LoveCity = "Shanghai" });
            }
            private void Button_Click_2(object sender, RoutedEventArgs e)
            {
                data.Collection[0].LoveCity = "Beijing";
            }

    没有类似的枢轴控件, 全景视图控件, 但有 FlipView 控件, 例子:http://code.msdn.microsoft.com/windowsapps/ListView-loading-behaviors-81811e9b


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

    2012年6月25日 5:39
    版主

全部回复

  • 如果你的右边的数据 Collection 是 ObservableCollection(T) Class, 他实现了INotifyCollectionChanged 接口,此接口可以在集合增减Item时通知其绑定的控件去更新。

    还有,你的Collection属性的每个Item的类型也需要实现 INotifyPropertyChanged 接口,这样每一项的属性变化也会通知到ListView中每一项的控件更新。 

    简单的一个例子:

      ObservableCollection<Item> items = new ObservableCollection<Item>()
      {
          new Item(){Name="xxx"}
      };
      listView.ItemsSource = items;
      
      ...
      
      
        public class Item : INotifyPropertyChanged
        {
            private string _name;
            public string Name
            {
                get { return _name; }
                set
                {
                    _name = value;
                    if (PropertyChanged != null)
                        PropertyChanged(this, new PropertyChangedEventArgs("Name"));
                }
            }
            public event PropertyChangedEventHandler PropertyChanged;
        }


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


    2012年6月22日 9:25
    版主
  •  Hi, Bob Bao,  没错我用的是 ObservableCollection, 但是 sdk 貌似没有删增 item 的例子,INotifyCollectionChanged 接口 在这里怎么用我还不会, 请指教。 另外我想问一下,  windows 8  有没有像 wp7 那样的 枢轴控件, 全景视图控件呢

    public class LoveCityCollection : IEnumerable<Object>
        {
            private System.Collections.ObjectModel.ObservableCollection<MyLoveCityItem> itemCollection = new System.Collections.ObjectModel.ObservableCollection<MyLoveCityItem>();

            public IEnumerator<Object> GetEnumerator()
            {
                return itemCollection.GetEnumerator();
            }

            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
            {
                return GetEnumerator();
            }

            public void Add(MyLoveCityItem item)
            {
                itemCollection.Add(item);
                //itemCollection.Remove(
            }

            public void Remove(MyLoveCityItem item)
            {
                itemCollection.Remove(item);
            }
            //public void Delete(
        }

      public class MyLoveCityItem : System.ComponentModel.INotifyPropertyChanged
        {
            public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

            protected virtual void OnPropertyChanged(string propertyName)
            {
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
                }
            }

            private string _loveCity = string.Empty;
            public string LoveCity
            {
                get
                {
                    return this._loveCity;
                }

                set
                {
                    if (this._loveCity != value)
                    {
                        this._loveCity = value;
                        this.OnPropertyChanged("LoveCity");
                    }
                }
            }

        }

     public class MyLoveCityData
        {
            private LoveCityCollection _Collection = new LoveCityCollection();

            public LoveCityCollection Collection
            {
                get
                {
                    return this._Collection;
                }
            }

    }

    2012年6月23日 3:56
  • 操作ObservableCollection很简单,并有没针对这一功能的例子。

    从你的代码来看,你完全可以直接继承 ObservableCollection, 而不用去自己实现 IEnumerable:

        public class MyLoveCityItem : System.ComponentModel.INotifyPropertyChanged
        {
            public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
            protected virtual void OnPropertyChanged(string propertyName)
            {
                if (this.PropertyChanged != null)
                    this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
            private string _loveCity = string.Empty;
            public string LoveCity
            {
                get { return this._loveCity; }
                set
                {
                    if (this._loveCity != value)
                    {
                        this._loveCity = value;
                        this.OnPropertyChanged("LoveCity");
                    }
                }
            }
        }
        public class LoveCityCollection : System.Collections.ObjectModel.ObservableCollection<MyLoveCityItem>
        {
        }
        public class MyLoveCityData
        {
            private LoveCityCollection _Collection = new LoveCityCollection();
            public LoveCityCollection Collection
            {
                get
                {
                    return this._Collection;
                }
            }
        }

    我们可以直接实例化MyLoveCityData,然后将其作为页面的数据上下文提供数据绑定:

            MyLoveCityData data = new MyLoveCityData();
            public MainPage()
            {
                this.InitializeComponent();
                this.DataContext = data;
            }

    前面界面可以简单设计一个ListView进行显示:

        <StackPanel Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
            <Button Content="Add" Click="Button_Click_1"/>
            <Button Content="Modify" Click="Button_Click_2"/>
            <ListView ItemsSource="{Binding Collection}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding LoveCity}"/>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </StackPanel>

    两个按钮事件如下:

            private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                data.Collection.Add(new MyLoveCityItem() { LoveCity = "Shanghai" });
            }
            private void Button_Click_2(object sender, RoutedEventArgs e)
            {
                data.Collection[0].LoveCity = "Beijing";
            }

    没有类似的枢轴控件, 全景视图控件, 但有 FlipView 控件, 例子:http://code.msdn.microsoft.com/windowsapps/ListView-loading-behaviors-81811e9b


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

    2012年6月25日 5:39
    版主
  •    这个链接 http://code.msdn.microsoft.com/windowsapps/ListView-loading-behaviors-81811e9b        无。     请问 bob bao,  你是怎么看到这个例子呢?

    Dev Center - Metro style apps<text>></text>

    示例    

    此项尚未发布。

            如果您是此项目的所有者,请使用相应的帐户登录。        
    2012年6月25日 6:14
  • 应该是官方临时撤下作些修改,没事等些时候就会好的,或者你可以下载完整的例子包,里面就有:http://code.msdn.microsoft.com/windowsapps/Windows-8-Modern-Style-App-Samples

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

    2012年6月25日 6:47
    版主