WP7:样式ListBox项目

时间:2012-06-11 18:36:41

标签: c# windows-phone-7 xaml

我是Windows Phone 7开发的新手。我需要创建一个与设置应用页面非常相似的页面。像这样的东西(但没有顶部的菜单和每个项目的子文本):
http://dotnetapp.com/wp-content/uploads/2012/05/BadSettingsPage.png

到目前为止,我已经有一个包含项目的列表框,但点击其中一个项目,项目颜色会发生变化,并且没有像设置应用程序那样的“按下按钮”效果。

第一个问题是如何创建这个漂亮的按钮效果(注意按下按钮时,根据点击的位置按下倾斜)。

我的第二个问题是关于不同的样式。 listBox的ItemsSource定义如下:

List<string> firstList;
List<string> secondList;

public MainPage()
{
    ...
    List<string> lst = new List<string>();
    lst.AddRange(firstList);
    lst.AddRange(secondList);
    listBox1.ItemsSource = lst;
    ...

我需要对项目设置不同的样式,无论它们来自firstList还是secondList,例如,如果项目来自firstList,则其颜色应为蓝色。

我认为应该使用StaticResource完成,但我不确定。也许我需要以某种方式包装字符串,以便它有一个getter来定义它来自哪个列表。

感谢。

1 个答案:

答案 0 :(得分:1)

回答问题1(参见William Mekanis评论)

对于问题2,你有一个大问题...你绑定了一个字符串列表...没有变化,看看哪个项目来自哪个列表。 我会为我的DataSource列表创建类似于视图模型的东西。

像这样的东西(NotifyPropertyChanged在这里被忽略,如果需要的话也可以实现它,并且也使用ObservableCollection;)):

public class ListDataSourceViewModel
{
    public string Text {get; set;}
    public bool IsFromFirstList {get; set;}
}

如果您有更多列表,您还可以使用枚举或其他任何作为列表标识符...

您为DataSource创建了一个新列表,如:

lst.AddRange(firstList.Select(item => new ListDataSourceViewModel 
     {
         Text = item, IsFromFirstList = true
     }
).ToArray());
lst.AddRange(secondList.Select(item => new ListDataSourceViewModel 
{
     Text = item, IsFromFirstList = false
}
).ToArray());

然后为listitem创建一个datatemplate,将文本块绑定到文本块,使用转换器将文本块的字体颜色绑定到IsFromFirstList属性。

这段代码是从头脑中编写的,没有VS ...如果你可以复制粘贴而没有问题但不应该没问题,但它应该给你的想法;) 如果您需要帮助创建数据模板和转换器,请告诉我!

编辑:

我重新思考了我的建议......使用转换器,特别是(潜在的)大型列表,并不是一个好主意(从性能的角度来看)。在您的情况下,直接在viewmodel中使用所需的颜色无论如何都不是问题。

我会改变

public bool IsFromFirstList {get; set;}

public Color WhatEverColor {get; set;}

在创建VM时根据需要进行设置,并将其绑定到您需要的任何位置。

希望它有所帮助!