0

我正在尝试将 ObservableCollection 项目绑定到 Windows Phone 的 Silverlight 工具包中的 ListPicker。我以前做过,但在我现在的情况下,我的 ObservableCollection 包含来自自定义类的项目。我不知道如何让类的每个属性(每个项目)绑定到我的 ListPicker。为了更好地说明我所拥有的内容如下:

主页.xaml

<Grid.Resources>
        <DataTemplate x:Name="SearchProviderItemTemplate">
            <StackPanel Orientation="Horizontal">
                <Image Source="{Binding Favicon}" />
                <TextBlock Text="{Binding Name}" Margin="12,0,0,0"/>
            </StackPanel>
        </DataTemplate>
        <DataTemplate x:Name="SearchProviderFullModeItemTemplate">
            <StackPanel Orientation="Horizontal">
                <Image Source="{Binding Favicon}" />
                <TextBlock Text="{Binding Name}" Margin="12,0,0,0"/>
            </StackPanel>
        </DataTemplate>
</Grid.Resources>

<toolkit:ListPicker x:Name="SearchProviderListPicker" ItemsSource="{Binding SearchProvider}" Margin="12,0,12,0" 
                            Header="Search provider" ItemTemplate="{Binding SearchProviderItemTemplate}"
                            FullModeHeader="Search provider" FullModeItemTemplate="{Binding SearchProviderFullModeItemTemplate}"
                            SelectedIndex="{Binding}"
                            SelectionChanged="SearchProviderListPicker_SelectionChanged" 
                            CacheMode="BitmapCache"/>

MainPage.xaml.cs

public MainPage()
    {
        InitializeComponent();

        //This data is placed here for convenience right now
        ListItem Bing = new ListItem { Favicon = "", Name = "Bing", Address = "http://www.bing.com/search?q=" };
        ListItem Google = new ListItem { Favicon = "", Name = "Google", Address = "http://www.google.com/search?q=" };
        ListItem Yahoo = new ListItem { Favicon = "", Name = "Yahoo", Address = "http://search.yahoo.com/search?p=" };
        ListItem Ask = new ListItem { Favicon = "", Name = "Ask", Address = "http://www.ask.com/web?q=" };
        ListItem Aol = new ListItem { Favicon = "", Name = "AOL", Address = "http://search.aol.com/search?q=" };

        Settings.SearchProvider.Value.Add(Bing);
        Settings.SearchProvider.Value.Add(Google);
        Settings.SearchProvider.Value.Add(Yahoo);
        Settings.SearchProvider.Value.Add(Ask);
        Settings.SearchProvider.Value.Add(Aol);

        // Set the data context of the SearchProviderListPicker control to the data
        DataContext = App.ViewModel;
    }

主视图模型.cs

    public ObservableCollection<ListItem> SearchProvider { get; private set; }

    public MainViewModel()
    {
        SearchProvider = Settings.SearchProvider.Value;
    }  

上面引用的 Settings 类用于将SearchProviderObservableCollection 存储在隔离存储中。

设置.cs

public static Setting<ObservableCollection<ListItem>> SearchProvider = new Setting<ObservableCollection<ListItem>>("SearchProvider", new ObservableCollection<ListItem>());

Setting 类从隔离存储中保存和获取数据。此外,我的自定义 ListItem 类演示了我需要使用的属性。

列表项.cs

public string Favicon
    {
        get;
        set;
    }

    public string Name
    {
        get;
        set;
    }

    public string Address
    {
        get;
        set;
    }

所以基本上每个SearchProviderObservableCollection 项目都包含Favicon, Name, and Address我需要使用的,我只想将Faviconand绑定Name到 ListPicker。不过,我的问题是 ListPicker 提供了 5 个搜索提供程序,但每个搜索提供程序的文本都说明Project1.Common.ListItem了 ListItem 类在我的 Common 文件夹中的位置。我不能将这些正确绑定到视图,但我不知道如何正确完成此操作?

4

2 回答 2

0

您的 ListPicker 的模板是 Grid.Resources 中定义的静态资源

因此,您必须像这样更改 ListPicker xaml 代码

ItemTemplate="{Binding SearchProviderItemTemplate}"
FullModeItemTemplate="{Binding SearchProviderFullModeItemTemplate}"

将以上两个属性替换为以下

ItemTemplate="{StaticResource SearchProviderItemTemplate}"
FullModeItemTemplate="{StaticResource SearchProviderFullModeItemTemplate}"
于 2012-09-20T06:32:02.547 回答
0

如果您收到“Project1.Common.ListItem”作为文本,这意味着您的绑定是正确的,但您的模板有问题。

第一个更正如上所示,当您引用模板时,您需要使用“StaticResource”而不是“Binding”。

请重新检查您的模板是否有任何拼写错误等。

如果我是你,我会首先尝试在不使用设置类的情况下使其工作,看看是否有帮助

于 2012-09-20T21:25:14.860 回答