【问题标题】:ListPicker not working with MVVM LightListPicker 不适用于 MVVM Light
【发布时间】:2011-09-26 14:46:03
【问题描述】:

我正在构建一个简单的 windows phone 7 Page。我正在做 MVVM(使用 MVVM 灯)并将List<Category> 类型属性绑定到ListPicker。此属性在名为 AddExpenseViewModel 的视图模型中定义,如下所示

public class AddExpenseViewModel:ViewModelBase 
{
    public List<Category> Categories
    {
        get { return categories; }
        set
        {
            categories = value;
            RaisePropertyChanged("Categories");
        }
    }
}

Category 类定义为

public class Category
{
    public string Name { get; set; }
}

在我的 XAML 中,我首先将资源定义为

<UserControl.Resources> <bs:ViewModelLocator x:Key="ViewModelLocator" /> </UserControl.Resources>

然后将包含ListPicker的网格的DataContext设置为

<Grid x:Name="ContentPanel" 
              Grid.Row="1" 
              Margin="13,1,11,-1" 
              DataContext="{Binding Path=AddExpenseViewModel, 
                                    Source={StaticResource ViewModelLocator}}">

这是我的 ListPicker 的 XAML

<toolkit:ListPicker 
            HorizontalAlignment="Left" 
            Height="50" 
            Width="200" 
            Grid.Row="2" 
            Grid.Column="1" 
            DataContext="{Binding AddExpenseViewModel}"
            ItemsSource="{Binding Path=Categories, Mode=OneWay}" >
            <toolkit:ListPicker.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Border Background="LightGreen" Width="*" Height="*">
                            <TextBlock Text="{Binding Name}"></TextBlock>
                        </Border>
                    </StackPanel>
                </DataTemplate>
            </toolkit:ListPicker.ItemTemplate>
</toolkit:ListPicker>`

这不起作用。 ListPicker 始终为空。我在这里做错了吗?

【问题讨论】:

    标签: windows-phone-7 mvvm mvvm-light listpicker


    【解决方案1】:

    在运行应用程序时,您是否在输出中看到任何 Xaml 绑定错误?

    如果您在父元素(您的网格)上执行此操作,您也不应该在 ListPicker 上绑定 DataContext。这可能是您的问题,但绑定错误应该提供一些详细信息。

    【讨论】:

    • 我在输出窗口中看到了绑定错误,但这并没有多大帮助。如果我删除 ListPicker 的 DataContext,那么我会得到一个类型为 MS.Internal.WrappedException 的异常,消息为“0x8000ffff”。我正在用更多细节更新问题。
    • 您可以将您在绑定窗口中看到的消息发布吗?它通常解释了哪些属性失败以及如何失败。
    • 我的问题已解决。我已经用详细信息更新了问题
    【解决方案2】:

    经过大量灭火后,我自己解决了这个问题。这是我为使其正常工作所做的更改

    我介绍了一个新的类如下

    public class Categories : ObservableCollection<Category>
    {
    }
    

    然后我更改了 AddExpenseViewModel 上的属性类别,如下所示

    public Categories Categories
    {
        get { return categories; }
        set
        {
            categories = value;
            RaisePropertyChanged("Categories");
       }
    }
    private Categories categories;
    

    然后我将 listpicker 上的 ItemsSource 更改为

    ItemsSource="{Binding Path=Categories}"
    

    这让它工作了。

    【讨论】:

      【解决方案3】:

      资源的密钥与类型相同可能是问题所在。您可以更改大小写或完全重命名。

      试试:

      <bs:ViewModelLocator x:Key="locator" /> 
      

      DataContext="{Binding AddExpenseViewModel, Source={StaticResource locator}}"
      

      您也不需要将 Grid 的 DataContext 和 ListPicker 设置为相同的东西。如果你只在 ListPicker 中使用 VML,我也不会在网格上设置它。

      您应该使用 TwoWay 与 ListPicker 绑定,因为它需要跟踪所选项目

      【讨论】:

      • 如果我删除了 ListPicker 的 DataContext,那么我会得到一个 MS.Internal.WrappedException 类型的异常,消息为“0x8000ffff”。我正在用更多细节更新问题。
      • 我找到了这个错误的原因。它与数据绑定无关。 ItemTemplate 中的边框的高度和宽度设置为“*”。将此更改为Auto 后,异常消失了
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      • 2014-08-04
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-29
      相关资源
      最近更新 更多