ListPicker不能与MVVM Light一起使用

时间:2011-09-26 14:46:03

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

我正在建造一个简单的windown手机7页。我正在使用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>

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

<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始终为空。我在这里做错了吗?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

经过大量的消防后,我自己开始工作了。以下是我为改变这种情况所做的改变

我介绍了一个新课程,如下所示

public class Categories : ObservableCollection<Category>
{
}

然后我在AddExpenseViewModel上更改了属性Categories,如下所示

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

然后我将listpicker上的ItemsSource更改为

ItemsSource="{Binding Path=Categories}"

这已经成功了。

答案 2 :(得分:0)

让资源的密钥与类型相同可能是问题。您可以更改案例或完全重命名。

尝试:

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

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

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

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