0

確かにnoobエラー(昨日の午後、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>       

問題は、1 つまたは複数のアイテムをHistory.Lapsコレクションに追加すると、リスト ボックスが更新されず、これらのアイテムが表示されないことです。
しかし、コメントを// History.Laps.Add(new ChronoLap()...オンラインで削除すると、このアイテムが表示され、他のすべてが後で挿入されます。
詳細:そのコメントを削除してからHistory.Laps.Clear()(バインディングを設定する前または後に)書き込むと、バインディングが機能しなくなります。コレクションが空だと気が狂いそうです。
理由が本当に分からない…

更新と解決策
移動した場合

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

からすべてが期待どおりに機能しますbutStart_Click。 誰かが私に理由を説明できますか?public MainPage()

4

2 に答える 2

0

リストボックスの 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); } } }


ユーザーにUIにロードする前にデータを更新する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;

namespace StirLibrary.com.UI { public class UIManager : INotifyPropertyChanged { private static UIManager instance = null; private static string TAG = "UIManager";
BitmapImage arrowImage = Utils.returnImage(ImageUtils.ARROW);

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

    }
}

}

于 2012-08-31T09:36:27.863 に答える
0

実際、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)});
                          };
        }
    }
于 2012-06-01T22:04:45.447 に答える