簡體   English   中英

WP7列表框綁定無法正常工作

[英]WP7 listbox binding not working properly

毫無疑問,是一個菜鳥錯誤(我昨天下午開始在WP7中進行開發),但是我在此上浪費了很多時間。
我發布了我的課程和部分代碼:

public class ChronoLaps : INotifyPropertyChanged
{
    private ObservableCollection<ChronoLap> laps = null;

    public int CurrentLap
    {
        get { return lap; }
        set
        {
            if (value == lap) return;
            // Some code here ....
            ChronoLap newlap = new ChronoLap()
            {
                // Some code here ...
            };
            Laps.Insert(0, newlap);

            lap = value;
            NotifyPropertyChanged("CurrentLap");
            NotifyPropertyChanged("Laps");
        }
    }

    public ObservableCollection<ChronoLap> Laps { 
        get { return laps; }
        set
        {
            if (value == laps) return;
            laps = value;
            if (laps != null)
            {
                laps.CollectionChanged += delegate
                {
                    MeanTime = Laps.Sum(p => p.Time.TotalMilliseconds) / (Laps.Count * 1000);
                    NotifyPropertyChanged("MeanTime");
                };
            }
            NotifyPropertyChanged("Laps");
        }
    }
}

MainPage.xaml.cs

public partial class MainPage : PhoneApplicationPage
{
    public ChronoLaps History { get; private set; }

    private void butStart_Click(object sender, EventArgs e)
    {
        History = new ChronoLaps();
        // History.Laps.Add(new ChronoLap() { Distance = 0 });

        LayoutRoot.DataContext = History;
    }
}

MainPage.xaml

<phone:PhoneApplicationPage>    
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid Grid.Row="2">
            <ScrollViewer Margin="-5,13,3,36" Height="758">
                <ListBox Name="lbHistory" ItemContainerStyle="{StaticResource ListBoxStyle}"
                         ItemsSource="{Binding Laps}" 
                         HorizontalAlignment="Left" Margin="5,25,0,0"
                         VerticalAlignment="Top" Width="444">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding Lap}" Width="40" />
                                <TextBlock Text="{Binding Time}" Width="140" />
                                <TextBlock Text="{Binding TotalTime}" Width="140" />
                                <TextBlock Text="{Binding Distance}" />
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </ScrollViewer>
        </Grid>
    </Grid>
</phone:PhoneApplicationPage>       

問題是,當我向History.Laps集合中添加一個或多個項目時,我的列表框沒有刷新,並且這些項目沒有出現。
但是,如果我刪除對// History.Laps.Add(new ChronoLap()...行的評論), // History.Laps.Add(new ChronoLap()...顯示此項,並在以后插入其他項。
更多:如果我刪除該注釋,然后編寫History.Laps.Clear() (在設置綁定之前或之后),綁定將不再起作用。 如果集合為空,這將變得瘋狂。
我真的不明白原因...

更新和解決方案
如果我搬家

History = new ChronoLaps();
LayoutRoot.DataContext = History;

butStart_Clickpublic MainPage()一切正常。
有人可以解釋一下原因嗎?

實際上,我認為沒有單獨的ChronoLaps類是沒有意義的。 這是我修改MainPage.xaml.cs的代碼的方式,一切似乎對我來說都是有效的。

public partial class MainPage : PhoneApplicationPage
    {
        public ObservableCollection<ChronoLap> Laps { get; set; }
        public double MeanTime { get; set; }

        // Constructor
        public MainPage()
        {
            InitializeComponent();
            Laps = new ObservableCollection<ChronoLap>();
            Laps.CollectionChanged += delegate
            {
                MeanTime = Laps.Sum(p => p.Time.TotalMilliseconds) / (Laps.Count * 1000);
            };
            DataContext = this;
            Loaded += (s, e) =>
                          {
                              Laps.Add(new ChronoLap() {Time = TimeSpan.FromSeconds(1000)});
                              Laps.Add(new ChronoLap() {Time = TimeSpan.FromSeconds(1000)});
                              Laps.Add(new ChronoLap() {Time = TimeSpan.FromSeconds(1000)});
                          };
        }
    }

嘗試為列表框綁定DataContext和ItemSource。

我是怎么做的..

 <ListBox x:Name="AppList" Background="White" DataContext="{Binding DisplayItem}" SelectionChanged="AppList_SelectionChanged" Height="500" Width="auto">
            <ListBox.ItemTemplate>
                <DataTemplate>
  </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

而且我不知道這是否有幫助,但我仍然會發布我正在使用的代碼。

ItemList.cs


using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Media.Imaging;

namespace AppHouseLibrary { public class ItemList : IComparable { private string _name; public string WidgetName { get { return _name; } set { _name = value; } } public int ID { get; set; } private BitmapImage _Icon; public BitmapImage Icon { get { return _Icon; } set { _Icon = value; } } //public string arrow { get; set; } public BitmapImage arrow { get; set; } public int CompareTo(ItemList other) { return this.WidgetName.CompareTo(other.WidgetName); } } }


我有一個UIManager.cs類,在將數據加載到用戶界面上之前先刷新其中的數據。

 using System; using System.ComponentModel; using System.Collections.ObjectModel; using System.Windows.Media.Imaging; using System.Collections.Generic; using StirLibrary.com.mportal.data.bean; using com.mportal.utils; using StirLibrary.com.mportal.utils; 

\n\n

命名空間StirLibrary.com.UI {公共類UIManager:INotifyPropertyChanged {私有靜態UIManager實例= null; 私有靜態字符串TAG =“ UIManager”;
BitmapImage arrowImage = Utils.returnImage(ImageUtils.ARROW);

\n\n
  public List<ItemList> data = new List<ItemList>(); public static UIManager getInstance() { if (instance == null) { instance = new UIManager(); } return instance; } private ObservableCollection<ItemList> _displayItem = new ObservableCollection<ItemList>(); public ObservableCollection<ItemList> DisplayItem { get { return _displayItem; } } private UIManager() { } public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(String PropertyName) { if (null != PropertyChanged) { PropertyChanged(this, new PropertyChangedEventArgs(PropertyName)); } } public WidgetBean[] serviceBeanList = null; public WidgetBean[] wheelBeanList = null; public WidgetBean getServiceWidgetBean(int selectedIndex) { try { if (serviceBeanList != null) { return serviceBeanList[selectedIndex]; } } catch (Exception e) { Logger.log(TAG, e.Message); } return null; } public WidgetBean getWheelWidgetBean(int selectedIndex) { try { if (wheelBeanList != null) { return wheelBeanList[selectedIndex]; } } catch (Exception e) { Logger.log(TAG, e.Message); } return null; } public void DisplayCatalog(string[] ServiceDisplayName, string[] WheelDisplayName, BitmapImage[] ServiceIcons, WidgetBean[] ServiceBeanList, WidgetBean[] WheelBeanList) { try { DisplayItem.Clear(); string disp1 = string.Empty; string name = ServiceDisplayName[0]; wheelBeanList = WheelBeanList; serviceBeanList = ServiceBeanList; for (int i = 0; i < ServiceDisplayName.Length; i++) { WidgetBean bean = serviceBeanList[i]; if (bean.isCategory()) { DisplayItem.Add(new ItemList { WidgetName = ServiceDisplayName[i], Icon = ServiceIcons[i], arrow = arrowImage }); } else { DisplayItem.Add(new ItemList { WidgetName = ServiceDisplayName[i], Icon = ServiceIcons[i] }); } } NotifyPropertyChanged("UI"); } catch (Exception e) { Logger.log(TAG,e.Message); } } public void DisplayCatalog(string[] displayName, BitmapImage[] icons, WidgetBean[] beanArray) { try { serviceBeanList = beanArray; DisplayItem.Clear(); for (int i = 0; i < displayName.Length; i++) { WidgetBean bean = serviceBeanList[i]; if (bean.isCategory()) { DisplayItem.Add(new ItemList { WidgetName = displayName[i], Icon = icons[i], arrow = arrowImage }); } else { DisplayItem.Add(new ItemList { WidgetName = displayName[i], Icon = icons[i] }); } } NotifyPropertyChanged("UI"); } catch (Exception e) { Logger.log(TAG,e.Message); } } } 
\n\n

}

\n\n

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM