0

我开发了一个应用程序,并在以下部分遇到了问题。

我有一个“文本块”,它绑定了可观察项目集合中的确切项目(“项目”)并显示数字。每个项目都有一个属性,称为“计数”。

当用户点击当前文本块时,它位于 longlistselector(绑定项目)的堆栈面板中,我需要这个文本块来显示新的数字(想法是每次用户点击文本块,数字增加 1)。

我发现的唯一方法是每次导航到当前枢轴项目(文本块所在的位置)以强制枢轴项目从可观察集合重新加载数据,其中存储更新的项目(和“计数”属性)。但它很慢而且效果不好。

请建议每次用户点击当前文本块时如何使数字出现在文本块中。

<phone:PivotItem Name="Documents" Header="Documents" Margin="0" >
                <Grid>
                    <phone:LongListSelector ItemsSource="{Binding Items}" >
                        <phone:LongListSelector.ItemTemplate>
                            <DataTemplate>


                                    <StackPanel  Orientation="Horizontal"
                                        Height="95" >


                                        <TextBlock Tap="Plus_Tap" Visibility="Visible" Width="20" Height="50" Text="{Binding Count}" FontFamily="Segoe WP Light"
                                                   FontSize="35" Foreground="White" Margin="2,0,0,2"/>

                                    </StackPanel>

                                </StackPanel>

                            </DataTemplate>

                        </phone:LongListSelector.ItemTemplate>


                    </phone:LongListSelector>


                </Grid>
            </phone:PivotItem>
namespace PackMan
{
    public partial class CategoryList : PhoneApplicationPage
    {
        public CategoryList()
        { 
            InitializeComponent();
            DataContext = App.ViewModel;
        }
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {

            if (!App.ViewModel.IsDataLoaded)
            {
                App.ViewModel.LoadData();
            }
        }
        private void Plus_Tap(object sender, System.Windows.Input.GestureEventArgs e)
        {
            PackList selectedList = (sender as TextBlock).DataContext as PackList;
            selectedList.Count += 1;

            NavigationService.Navigate(new Uri("/CategoryList.xaml?Documents", UriKind.Relative));

        }
    }
}

通过xaml UI更新数据后如何刷新数据透视项中的数据?

在这里,一个人在他对自己问题的发布答案的最后写道:“如果您使用 observableCollection,则无需刷新页面。这就是 ViewModel 的魔力。” 但是我从“Items”可观察集合中加载数据,该集合不在 ViewModel 中,而是在 Packlist.cs 中声明。也许这会有所帮助。

在这里,我确实增加了 ObservableCollection "Items" 中项目的 Count 属性:

private void Plus_Tap(object sender, System.Windows.Input.GestureEventArgs e)
        {
            PackList selectedList = (sender as TextBlock).DataContext as PackList;
            selectedList.Count += 1;

我点击文本块,文本块的文本没有显示任何变化。我点击返回 - 这让我回到菜单页面,然后我再次打开数据透视项目页面,并看到文本块的文本(数字)增加了 1。只有在我重新加载页面(数据透视项)时才能看到更改,因为我在它的构造函数和 OnNavigatedTo 方法中有这个:

 public CategoryList()
        { 
            InitializeComponent();
            DataContext = App.ViewModel;
        }
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {

            if (!App.ViewModel.IsDataLoaded)
            {
                App.ViewModel.LoadData();
            }
        }
LoadData() - loads OBservable collection ("Items"), which has items, and Count as one   of its properties:

public void LoadData()
        {
            this.Items = LoadNewLists();
            this.IsDataLoaded = true;
        }

也许现在你可以告诉我如何在我点击它时立即改变文本块的文本(文本块)。我会感谢任何建议,因为这一刻已经阻止了我第二天开发我的应用程序。

4

1 回答 1

0

我想到了。我应该已经阅读了 INotifyPropertyChanged 接口并使用此接口的方法创建了“计数”属性:

 public int Count
    {
        get
        {
            return _count;
        }
        set
        {
            if (value != _count)
            {
                _count = value;
                NotifyPropertyChanged("Count");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (null != handler)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

希望它对任何人都有帮助。

于 2014-04-14T14:36:01.383 回答