Windows Phone Panorama +数据绑定问题

时间:2010-11-22 11:00:32

标签: wpf data-binding windows-phone-7

我希望将字母表中的每个字母都作为单个Windows Phone PanoramaItem。请在此时接受。每个字母都以多种方式显示(斜体,常规,粗体,其他字体......)。当然我可以手动完成,但它不灵活。所以我决定写一个简单的Letter类,它基本上包含两个字符 - 一个字母的大写和小写。我们的想法是将这些信件的集合绑定到Panorama(myPano.ItemsSource = collection;)。这是模板:

<DataTemplate 
        x:Name="LetterTemplate">
        <controls:PanoramaItem

            Background="Black"
            HorizontalAlignment="Stretch"
            Name="{Binding Path=UpperCase}"
            ManipulationCompleted="A_ManipulationCompleted"
            >
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="0.5*"/>
                <RowDefinition Height="0.5*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0.5*"/>
                <ColumnDefinition Width="0.5*"/>
            </Grid.ColumnDefinitions>
            <StackPanel
                Grid.Row="0"
                Grid.Column="0"
                Orientation="Vertical"
                HorizontalAlignment="Stretch">
                <TextBlock
                    Text="{Binding Path=UpperCase}"
                    Foreground="{StaticResource PhoneAccentBrush}"
                    HorizontalAlignment="Center"
                    FontFamily="Segoe WP"
                    FontSize="100" />
                <TextBlock
                    Text="{Binding Path=UpperCase}"
                    HorizontalAlignment="Center"
                    Foreground="White"
                    FontFamily="Courier New"
                    FontSize="100" />
            </StackPanel>
            <StackPanel
                Grid.Row="0"
                Grid.Column="1"
                Orientation="Vertical"
                HorizontalAlignment="Stretch">
                <TextBlock
                    Text="{Binding Path=UpperCase}"
                    Foreground="White"
                    HorizontalAlignment="Center"
                    FontFamily="Segoe WP"
                    FontStyle="Italic"
                    FontSize="100" />
                <TextBlock
                    Text="{Binding Path=UpperCase}"
                    HorizontalAlignment="Center"
                    Foreground="{StaticResource PhoneAccentBrush}"
                    FontStyle="Italic"
                    FontFamily="Courier New"
                    FontSize="100" />
            </StackPanel>
                <StackPanel
                Grid.Row="1"
                Grid.Column="0"
                Orientation="Vertical"
                HorizontalAlignment="Stretch">
                    <TextBlock
                    Text="{Binding Path=LowerCase}"
                    Foreground="{StaticResource PhoneAccentBrush}"
                    HorizontalAlignment="Center"
                    FontFamily="Segoe WP"
                    FontStyle="Italic"
                    FontSize="100" />
                    <TextBlock
                    Text="{Binding Path=LowerCase}"
                    HorizontalAlignment="Center"
                    Foreground="White"
                    FontStyle="Italic"
                    FontFamily="Courier New"
                    FontSize="100" />
                </StackPanel>
                <StackPanel
                Grid.Row="1"
                Grid.Column="1"
                Orientation="Vertical"
                HorizontalAlignment="Stretch">
                    <TextBlock
                    Text="{Binding Path=LowerCase}"
                    Foreground="White"
                    HorizontalAlignment="Center"
                    FontFamily="Segoe WP"
                    FontStyle="Italic"
                    FontSize="100" />
                    <TextBlock
                    Text="{Binding Path=LowerCase}"
                    HorizontalAlignment="Center"
                    Foreground="{StaticResource PhoneAccentBrush}"
                    FontStyle="Italic"
                    FontFamily="Courier New"
                    FontSize="100" />
                </StackPanel>
            </Grid>
    </controls:PanoramaItem>

我知道在为Windows Phone编程时,它不是以性能为导向,但让我们暂时保留这种方式。

Panorama在电话页面的构造函数中填充了一个简单的循环,从字符代码'A'迭代到'Z',创建相应的字母并将其添加到字母集合中。它工作得很好,但有点慢:我不得不等待~3秒才显示,这是不可接受的。

我对此问题的第一个解决方案是将字母表集合限制为5个字母,并在选择更改时编辑其中的4个字母。我尝试了几种方法,但基本上我的问题是在修改发生时更新PanoramaItems。

从集合中删除并添加Letters:不会破坏漂亮的过渡。 当包含的Letter的属性发生变化时,使集合触发CollectionChanged:尝试它,与之前一样。 BindingExpression的UpdateTarget():该方法似乎在.NET CE中不可用。

也许我忽视了某些事情,或者只是遵循了完全不合适的方法。你会怎么做?

提前致谢!

4 个答案:

答案 0 :(得分:2)

请记住,26个PanoramaItem可能会降低性能。

查看Best Practices section here中的第一个要点,它说:

  

通过将所用部分的数量限制为最多四个部分,确保全景应用程序顺利执行。如果您的内容密集,或者您的许多部分共享多个托管控件,那么您应该使用更少的部分。

答案 1 :(得分:0)

为了完整起见:我现在第一次离开它(26 PanoramaItems),只是删除了我的DataTemplate中的StackPanels并将ObservableCollection更改为List。根据{{​​3}},我应该获得一个小的性能提升。没关系。

仍然......如果你知道我在Windows Phone上更新单个PanoramaItem(绑定目标)的特定问题的解决方案,请告诉我。

亲切的问候。

答案 2 :(得分:0)

如果使用以下类结构:

class LetterContainer
{
    public Letter Letter { get; set; }
}

class Letter
{
    public String UpperCase { get; set; }
    public String LowerCase { get; set; }
}

而不是创建类Letter的列表,而是创建一个类型LetterContainer的列表以与Parorama控件绑定。当然,您需要更改已创建的Template中的绑定。现在,您所做的就是更改Letter个对象中LetterContainer属性的值。这样,不会触发CollectionChanged个事件。但是,请确保为PropertyChangedLetterUpperCase属性举办LowerCase个活动。

答案 3 :(得分:0)

感谢您的回复!

@decyclone:奇怪的是,我没有看到你的......无论如何,也许我会试一试。我只是想知道我对该系列的解决方案有多么不同。我在Letter中实现了NotifyPropertyChanged并解雇了它,但是PanoramaItem没有自动更新。为什么现在应该这样做?

@MartinHN:我知道在谈到性能时,这不是最好的解决方案。这就是我在第一篇文章中所说的以及我在这里问过的原因:)