使用ListBox在Windows Phone 8应用程序中进行数据绑定

时间:2013-04-04 12:01:55

标签: c# windows-phone-7 data-binding binding

这是我的代码。这是做什么的。我有一个带有文本书名的文本框(按钮),当我点击它时,我可以使用绑定更改文本框中的文本。但现在我为作者名称添加了另一个文本框,我不知道如何绑定它。如果我使用相同的方法,如书名,它不起作用或书名中的文字也是书籍作者。所有文本都通过弹出设置页面进行更改。

我的来源:https://dl.dropbox.com/u/40039421/App1.rar。 图片在这里:https://dl.dropbox.com/u/40039421/helpp.png

 public partial class MainPage : INotifyPropertyChanged
{
    private ObservableCollection<Book> _books = new ObservableCollection<Book>();
    public ObservableCollection<Book> AllBooks
    {
        get { return _books; }
        set { _books = value; }
    }

    ...

    private void InitializeData()
    {

        var bookName1 = new Book { Id = 1, BookName = "Small red apple",AuthorName = "Daniel"};
        ...

        AllBooks.Add(bookName1);
       ...

        OnPropertyChanged("AllBooks");
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(null, new PropertyChangedEventArgs(propertyName));
        }
    }

    private void btnGreenBook_Click(object sender, RoutedEventArgs e)
    {
        var button = sender as Button;
        if (button != null)
        {
            Popup popup = new Popup();
            popup.VerticalOffset = 30;
            PopupSettingPage control = new PopupSettingPage();
            popup.Child = control;
            popup.IsOpen = true;

            control.btnSave.Click += (s, args) =>
            {
                var id = Convert.ToInt32(button.Tag);
                var book = AllBooks.FirstOrDefault(sub => sub.Id == id);
                if (book != null)
                {
                    book.BookName = control.BookName;
                    book.OnPropertyChanged("BookName");

                }

                popup.IsOpen = false;
            };

           ...

2 个答案:

答案 0 :(得分:0)

哦,亲爱的,这是一个简单的错误:)

您忘了在PopupSettingsPage.xaml的Xaml中添加AuthorName

<TextBox x:Name="tbInputAuthorName" Text="{Binding AuthorName, Mode=TwoWay}" VerticalAlignment="Center"/>

然后在MainPage中执行此操作

book.BookName = control.BookName;
book.OnPropertyChanged("BookName");
book.AuthorName = control.AuthorName;
book.OnPropertyChanged("AuthorName");

基于您的评论的补充答案:

为了实现这一点,您必须删除列表框中的第二个堆栈面板。而是使用WrapPanel控件。搜索如何使用WrapPanel for WindowsPhone。

然后你必须找到一些方法将背景设置为红色或绿色。祝你好运

答案 1 :(得分:0)

好的,我使用换行面板,但问题仍然存在。我有两个全景项目(我从第1项发布代码,第2项只在第二个全景页面上显示相同的代码),如果我将一些值保存到全景项目1中的项目之一,问题仍然存在这个值在全景项目中也是如此2,我不知道怎么做。逻辑单击全景1项目更改值在panoam 1项目中,单击全景2项目更改全景2项目值。它看起来像全景项目1具有相同的ID,如全景项目2.这里是完整的来源:https://dl.dropbox.com/u/40039421/App1SecondEdit.rar

<Grid x:Name="LayoutRoot" Background="Transparent">
     <!--Panorama control-->
    <phone:Panorama>
        <!--Panorama item 1-->
        <phone:PanoramaItem Header="Test">
            <Grid x:Name="PanelPanoramaItem1" 
          Grid.Row="1"
          Margin="25,0,12,0">
                <ListBox ItemsSource="{Binding AllBooks}">
                    <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <toolkit:WrapPanel Orientation="Vertical"/>
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                   <Button Width="140"
                            Height="140"
                            toolkit:TiltEffect.IsTiltEnabled="True" Margin="0,0,0,5" Click="Button_Click_1" Tag="{Binding Id}" >
                                            <Button.Template>
                                                <ControlTemplate>
                                                    <Grid Background="Chartreuse">
                                                        <TextBlock Foreground="Black" Text="{Binding BookName}" />
                                                    </Grid>
                                                </ControlTemplate>
                                            </Button.Template>
                                        </Button>

                                    </DataTemplate>
                                </ListBox.ItemTemplate>
                            </ListBox>
            </Grid>
        </phone:PanoramaItem>
        <!-- END Panorama item 1 -->