0

我有两个视图模型,在第一个视图模型上我有一个列表框:

<ListBox x:Name="MainMenu" toolkits:TiltEffect.IsTiltEnabled="True" 
 SelectedItem="{Binding SelectedItem, Mode=TwoWay}" 
 ItemTemplate="{StaticResource MainMenu}" 
 ItemsSource="{Binding Categories}" Margin="0,97,0,0" 
 Tap="MainMenu_Tap">

在第二页,我有一个列表选择器

<toolkit:ListPicker Margin="0,153,0,0" Background="{StaticResource PhoneAccentBrush}" VerticalAlignment="Top"
 ItemsSource="{Binding Categories}"
 SelectedItem="{Binding Item}"
 ItemTemplate="{StaticResource CategorySelector}"
 FullModeHeader="Category" 
 FullModeItemTemplate="{StaticResource FullCategorySelector}"
 BorderBrush="{StaticResource PhoneAccentBrush}"/>

我想要的是当我导航到第二页时,第一页中的选定项目将在第二页中被选中。但是当我导航到第二页时,我总是得到所选项目必须始终设置为有效值。

第一个视图模型

private CategoryModel _selectedItem = null;
public CategoryModel SelectedItem
{
    get { return _selectedItem; }
    set
    {
        if (_selectedItem == value)
        {
            return;
        }

        var oldValue = _selectedItem;
        _selectedItem = value;

        RaisePropertyChanged("SelectedItem", oldValue, value, true);
    }
}

第二个视图模型

private CategoryModel _item = null;
public CategoryModel Item
{
    get { return _item; }
    set
    {
        if (_item == value)
        {
            return;
        }

        var oldValue = _item;
        _item = value;

        // Update bindings, no broadcast
        RaisePropertyChanged("Item");
    }
}

在此处输入图像描述

编辑

当我将第二页中的列表选择器更改为列表框时,它工作得很好。

所以这是一个问题,请在此处输入链接描述。我应该怎么做才能让这个东西与 listpicker 一起工作?

4

2 回答 2

0

ListPicker 使用 Items.IndexOf 来获取应该选择的项目实例的索引。

如果实例不匹配(它不是集合中的对象实例),IndexOf 将返回 -1,并抛出 InvalidOperationException 并显示消息:“SelectedItem 必须始终设置为有效值”。

覆盖集合中类型的 Equals 方法,它将按预期工作。

例子:

public override bool Equals(object obj)
{
         var target = obj as ThisTarget;
         if (target == null)
             return false;

         if (this.ID == target.ID)
             return true;

         return false;
 }

希望能帮助到你

于 2013-07-04T15:43:30.407 回答
0

我认为您混淆了视图和视图模型。

因为您在 XAML 中绑定所选项目,所以当解析 XAML 并创建页面时,它会尝试绑定到尚未创建的集合中的项目。这就是为什么在后面的代码中设置此错误时有关错误的评论建议解决方法。

Tap第一页的处理程序中,我假设您将所选项目的一些详细信息传递到第二页。因此,您可以删除所选项目的 XAML 绑定,并在OnNavigatedTo第二页的事件处理程序中设置代码中的绑定,一旦您知道 ItemsSource 已被填充。

或者,您可以考虑让两个页面共享相同的视图模型实例。

于 2013-03-07T16:29:07.560 回答