2012-08-10 106 views
0

所以我有一个列表框,我正在尝试做一个“成就页面”。一切工作好,如果我用一个列表,但是当我切换到列表有显示,甚至从XAML不是没事......Windows Phone 7列表框不显示

public partial class achievementPage : PhoneApplicationPage 
{ 
    public string Description { get; set; } 
    public string Type { get; set; } 
    public achievementPage() 
    { 
     InitializeComponent(); 
     loadListbox(); 
    } 
    public achievementPage(string achievementGet, string d1) 
    { 
    } 
    public void loadListbox() 
    { 
     achievementStoreage.loadData(); 
     List<achievementPage> achievementList = new List<achievementPage>(); 
     achievementList.Add(new achievementPage(achievementStoreage.achievement1, "This is a  test")); 
     achievementList.Add(new achievementPage(achievementStoreage.achievement2, "This is another test")); 
     //List<string> achievementList = new List<string>(); 
     //achievementList.Add("Sup"); 
     achievementListBox.ItemsSource = achievementList; 
    } 
} 

<ListBox Name="achievementListBox" Margin="0,0,0,0" > 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Button Width="776" Height="120" BorderBrush="Black"> 
       <Button.Content> 
        <StackPanel Orientation="Horizontal" Height="50"> 
         <StackPanel Orientation="Horizontal" Height="40"> 
          <TextBlock Width="150" Foreground="Black" FontSize="22" Text="Description:" Height="40"/> 
         </StackPanel> 
        </StackPanel> 
       </Button.Content> 
      </Button> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

我得到的是一个空白页。PS不要担心关于achievementStoreage,它工作正常。(只是我存储数据的地方)

+0

你在哪里做与列表框的数据绑定。 ?? – 2012-08-10 23:04:21

+0

他这样做:'achievementListBox.ItemsSource = achievementList;'在函数'loadListBox'中调用cott .. – quetzalcoatl 2012-08-10 23:12:25

+0

但我在讲述如何绑定textblock Text属性,如下所示Text =“{Binding AchvCount}” – 2012-08-10 23:14:26

回答

1

坦率地说,看来你是根本不能与UI元素作为项目DataContexts一起使用的ItemTemplate。我试着:

achievementListBox.ItemsSource = new [] {"a","b"}; 

和这两个项目分别为可见光和印刷假的“描述”文本,但没有以下行我试过的已提出任何东西:

achievementListBox.ItemsSource = new [] { new TextBlock(), new TextBlock()}; 
achievementListBox.ItemsSource = new [] { new Rectangle(), new Rectangle()}; 
achievementListBox.ItemsSource = new [] { new Grid(), new Grid()}; 

尝试与您的自定义页面 - 相同。没有显示项目。

这很容易让人误解。项目显示为,但看看上面的行:控件创建,没有内容设置!

事实证明,如果ListBox中检测到该项目是的UIElement,那么它使用的ItemTemplate,但它直接呈现了的UIElement!

achievementListBox.ItemsSource = new[] { new TextBlock() { Text = "bbb" }, new TextBlock() { Text = "eee" } }; 
achievementListBox.ItemsSource = new[] { new Rectangle() { Fill = new SolidColorBrush(Colors.Red), Width = 30, Height = 10 }, new Rectangle() { Fill = new SolidColorBrush(Colors.Green), Width = 30, Height = 10 } }; 

var gridA = new Grid() { Width = 110, Height = 40 }; gridA.Children.Add(new Rectangle() { Fill = new SolidColorBrush(Colors.Red) }); 
var gridB = new Grid() { Width = 110, Height = 40 }; gridB.Children.Add(new Rectangle() { Fill = new SolidColorBrush(Colors.Green) }); 
achievementListBox.ItemsSource = new[] { gridA, gridB }; 

上述所有的三个例子完全忽略ListBox.ItemTemplate,而是,它们显示直接在两个项目:两个文本框,两个矩形,两个较大的矩形(在一个网格)。

回到您的案例:这意味着,使用您的原始设置,ListBox将尝试直接显示这些项目 - 因为您的自定义页面是UIElement。而且的确如此!但是你的网页是空的。在重载的构造函数中,您省略了通过读取XAML代码构造视图的InitializeComponent();。下面是一个更正的例子,它显示了“Hello”三次:一次只是因为它位于页面上,接下来两次是因为ListBox行被设置为同一页面。

请原谅我重命名类,我只是开始一个新的项目,而不是粘贴你的代码。
请注意,我不得不添加到XAML一些其他控件,因为作为数据项中的页面会显示为空的,因为他们没有任何项目设置

public partial class MainPage : PhoneApplicationPage 
{ 
    public string Description { get; set; } 
    public string Type { get; set; } 

    public MainPage() 
    { 
     InitializeComponent(); 
     loadListbox(); 
    } 

    public MainPage(string achievementGet, string d1) 
    { 
     InitializeComponent(); 
     someText.Text = d1; 
    } 

    public void loadListbox() 
    { 
     achievementListBox.ItemsSource = new[] { new MainPage(null, "ddd"), new MainPage(null, "ccc") }; 
    } 
} 

<StackPanel> 
    <TextBlock> 
     <Run Text="Hello" /> 
     <Run Text=" " /> 
     <Run x:Name="someText" /> 
    </TextBlock> 

    <ListBox Name="achievementListBox" Margin="0,0,0,0"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Width="150" Foreground="White" 
          FontSize="22" Text="This DataTemplate is IGNORED because the Item is UIElement" 
          Height="40"/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</StackPanel> 

我试图塑造码以与你类似的方式,删除一些与问题无关的行。我希望这可以解释你现在的一切:)

+0

这就是我正在寻找的,谢谢!令人敬畏的工作btw。 – 2012-08-11 18:11:17

1

哦,我的。为什么要创建一个achievementPage s的列表?在您achievementPage你会希望有一个ListBox与类型的项目,如,AchievementItemCompletedAchievementNotCompletedAchievement

目前,什么也不显示了,因为你的代码可能会抛出StackoverflowException(不是开玩笑在这里:))。看看:您的achievementPage构造函数调用loadListBox,它创建两个achievementPages并将它们添加到列表中。但是创建两个achievementPages会导致它们的构造函数再次被调用两次,这会调用两次loadListBox,等等。

- 编辑:ok,no stackoverflow,我刚刚注意到了第二个构造函数。你应该坚持用你知道的大写字母来命名类:)总之,把Page作为ListBox的数据项放在Page上是坏主意

你想要得到什么应该更像:

public partial class AchievementPage : PhoneApplicationPage 
{ 
    public string Description { get; set; } 
    public string Type { get; set; } 

    public AchievementPage() 
    { 
     InitializeComponent(); 
     loadListbox(); 
    } 

    public void loadListbox() 
    { 
     var theList = new List<Achievement>(); 
     theList.Add(new Achievement{ AchvCount=3, AchvName="medals" }); 
     theList.Add(new Achievement{ AchvCount=2, AchvName="badges" }); 
     theList.Add(new Achievement{ AchvCount=6, AchvName="zonks" }); 

     achievementListBox.ItemsSource = achievementList; 
    } 
} 

public class Achievement : DependencyObject 
{ 
    public int AchvCount {get; set;} 
    public string AchvName {get; set;} 
} 

<ListBox Name="achievementListBox" Margin="0,0,0,0"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="50" /> 
        <ColumnDefinition Width="50" /> 
        <ColumnDefinition Width="50" /> 
       </Grid.ColumnDefinitions> 

       <TextBlock Grid.Column="0" Text="You've got:" /> 
       <TextBlock Grid.Column="0" Text="{Binding AchvCount}" /> 
       <TextBlock Grid.Column="0" Text="{Binding AchvName}" /> 
      </Grid> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

我已经取得了成就“DependencyObject”,但我已经ommited DependencyProperties的可读性。如果您想在属性更改时进行适当的更改通知和UI自动更新 - 您必须添加它们! – quetzalcoatl 2012-08-10 23:14:45

+0

好的建议,但我正在寻找一个答案,为什么我的代码目前不工作,而不是让它工作的另一种方式。为我重写代码并不能帮助我理解为什么当前的代码无法工作。再次,输入是非常赞赏。 – 2012-08-11 04:49:13

+0

我明白了,但我手头没有WP7设备来测试你的代码,所以我只是“在内存中分析”。看到第二个构造函数重载,我没有看到任何错误。尝试使用acquiremntPage/PhoneApplicationPage作为列表的数据项是很臭的,但它**应该**正常工作,就像你已经在下面用字符串列表尝试了一样。我能想象的唯一的事情就是颜色,但是你说bkg是白色的 - 所以不是这样。我假设XAML是完整的,而不是在ListBox中添加/修改.ItemsSource或.Items道具..我会在星期一尝试设备。 – quetzalcoatl 2012-08-11 13:56:51