使用Code的PivotItem内容?

时间:2011-11-10 05:11:14

标签: c# windows-phone-7

行...

这让我感到困惑......我有办法想到这样做......但我不知道从哪里开始。

我想在代码中添加一个PivotItem,例如......

for (int i = 0; i < App.Accounts.Items.Count; i++)
{
     PivotItem pvItem = new PivotItem();

     pvItem.Header = App.Accounts.Items[i].Username;

     pvItem.Content = "";

     pivotControl.Items.Add(pvItem);
}

现在,我遇到问题的方法是设置数据透视表的内容。

我想将此代码设置为内容:

            <ListBox x:Name="Accounts" Margin="0,0,-12,0">
                <StackPanel Orientation="Horizontal" Margin="0,0,0,17">
                    <StackPanel Width="455" x:Name="accWidth">
                        <TextBlock Text="Personal Account" FontSize="32" Margin="0,0,0,0" TextAlignment="Center" />
                        <toolkit:ToggleSwitch Header="Signed On" Tag="{Binding Tag}" IsChecked="{Binding SignedOn}" Checked="ToggleSwitch_Checked" Unchecked="ToggleSwitch_Unchecked" />
                        <toolkit:ToggleSwitch Header="Invisible Login" Tag="{Binding Tag}" IsChecked="{Binding InvisibleLogin}" Checked="ToggleSwitch_Checked" Unchecked="ToggleSwitch_Unchecked" />
                        <toolkit:ToggleSwitch Header="Show as Windows Phone 7" Tag="{Binding Tag}" IsChecked="{Binding MobileLogin}" Checked="ToggleSwitch_Checked" Unchecked="ToggleSwitch_Unchecked" />                            
                    </StackPanel>
                </StackPanel>
            </ListBox>

我能想到做的是:以某种方式创建另一个带有上述代码的.XAML表,但是,我将如何声明:

pvItem.Content = XAMLSheet.xaml;

除非有另一种方法,否则我认为这是我必须要做的。

我还需要事件工作,标签应该使用代码而不是像我原来那样使用数据绑定。

我尝试过这样做,但是,它只显示为文本而不是代码......

pvItem.Content = "<TextBlock Text=\"Hello\" />";

谢谢。

4 个答案:

答案 0 :(得分:1)

这是一个允许您动态分配PivotItem内容的解决方案:使用在布局根目录中声明的内容创建UserControl:

<UserControl x:Class="MyUserControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    d:DesignHeight="480" d:DesignWidth="480">

    <Grid x:Name="LayoutRoot">
       <ListBox x:Name="Accounts" Margin="0,0,-12,0">
            <StackPanel Orientation="Horizontal" Margin="0,0,0,17">
                <StackPanel Width="455" x:Name="accWidth">
                    <TextBlock Text="Personal Account" FontSize="32" Margin="0,0,0,0" TextAlignment="Center" />
                    <toolkit:ToggleSwitch Header="Signed On" Tag="{Binding Tag}" IsChecked="{Binding SignedOn}" Checked="ToggleSwitch_Checked" Unchecked="ToggleSwitch_Unchecked" />
                    <toolkit:ToggleSwitch Header="Invisible Login" Tag="{Binding Tag}" IsChecked="{Binding InvisibleLogin}" Checked="ToggleSwitch_Checked" Unchecked="ToggleSwitch_Unchecked" />
                    <toolkit:ToggleSwitch Header="Show as Windows Phone 7" Tag="{Binding Tag}" IsChecked="{Binding MobileLogin}" Checked="ToggleSwitch_Checked" Unchecked="ToggleSwitch_Unchecked" />                            
                </StackPanel>
            </StackPanel>
        </ListBox>
    </Grid>
</UserControl>

然后在您创建PivotItem的代码中,创建用户控件的新实例,确保设置DataContextItemsSource属性以支持您的绑定:< / p>

for (int i = 0; i < App.Accounts.Items.Count; i++)
{
    PivotItem pvItem = new PivotItem();
    pvItem.Header = App.Accounts.Items[i].Username;

    //instantiate your control and set the DataContext/ItemsSource to your model it will be bound to
    MyUserControl myControl = new MyUserControl();
    myControl.DataContext = someModel;
    myControl.List.ItemsSource = someModel.List;

    //assign content to the instance of your user control
    pvItem.Content = myControl;         

    pivotControl.Items.Add(pvItem);
}

答案 1 :(得分:0)

如果你真的需要添加xaml片段中的代码,你可以做XamlReader.Load(),虽然我不确定你为什么需要它。 如果你想从一个集合构建一个Pivot - 为什么不绑定到它的ItemsSource并将你的xaml作为ItemTemplate?您可能需要摆脱事件处理程序,而是将IsChecked绑定更改为Mode = TwoWay。

答案 2 :(得分:0)

我想出了一些......

我想不出另一种方式:

            ListBox lb = new ListBox();

            lb.Margin = new Thickness(0, 0, -12, 0);

            TextBlock tb = new TextBlock();

            tb.Text = App.Accounts.Items[i].Description;

            tb.FontSize = 32;

            tb.TextAlignment = TextAlignment.Center;

            tb.Width = 455;

            ToggleSwitch signOn = new ToggleSwitch();

            signOn.Tag = i.ToString();

            signOn.Header = "Signed On";

            signOn.IsChecked = App.Accounts.Items[i].SignedOn;

            signOn.Checked += new EventHandler<RoutedEventArgs>(signOn_Checked);

            signOn.Unchecked += new EventHandler<RoutedEventArgs>(signOn_Unchecked);

            signOn.Width = 455;

            ToggleSwitch invisLogin = new ToggleSwitch();

            invisLogin.Tag = i.ToString();

            invisLogin.Header = "Invisible Login";

            invisLogin.IsChecked = App.Accounts.Items[i].InvisibileLogin;

            invisLogin.Checked += new EventHandler<RoutedEventArgs>(invisLogin_Checked);

            invisLogin.Unchecked += new EventHandler<RoutedEventArgs>(invisLogin_Unchecked);

            invisLogin.Width = 455;

            ToggleSwitch wpLogin = new ToggleSwitch();

            wpLogin.Tag = i.ToString();

            wpLogin.Header = "Show as Windows Phone 7";

            wpLogin.IsChecked = App.Accounts.Items[i].InvisibileLogin;

            wpLogin.Checked += new EventHandler<RoutedEventArgs>(wpLogin_Checked);

            wpLogin.Unchecked += new EventHandler<RoutedEventArgs>(wpLogin_Unchecked);

            wpLogin.Width = 455;

            lb.Items.Add(tb);

            lb.Items.Add(signOn);

            lb.Items.Add(invisLogin);

            lb.Items.Add(wpLogin);

            pvItem.Content = lb;

是否有改进代码/使其不那么草率?

感谢。

答案 3 :(得分:0)

另一种方法是不使用代码,而是使用数据绑定来填充数据透视表。

Databinding PivotItems to ObservableCollection on WP7