WP7 - Невозможно привязать данные к одному и тому же объекту с двух страниц - PullRequest
0 голосов
/ 11 февраля 2012
  1. Page1 создает и привязывает данные к новому экземпляру Foo (назовите его theFoo)
  2. theFoo.Name задается через текстовое поле из Page1
  3. theFoo сохраняется в глобально доступных данныхструктура (список Foos, что угодно)
  4. переход от страницы 1 к странице 2
  5. Page2 привязывает к глобальному списку Foos, чтобы отобразить все экземпляры Foo

Когда яСделав это, я могу убедиться, что экземпляр Foo добавлен в глобальный список.Но Page2 никогда не показывает Foos.

Если я вручную добавлю Foos в глобальный список (в коде, а не из Page1), а затем перейду к Page2, вообще не переходя к Page1, я вижу, что Foos отображается на Page2.

В чем здесь проблема?

Обновление:

Вот некоторый соответствующий код ...

Item.cs (Данные и глобальная структура хранения)

public class Item
{
    public string Name { get; set; }
}

internal static class ItemRepos
{
    private static List<Item> _items = new List<Item>();

    public static Item New()
    {
        return new Item();
    }

    public static int Count
    {
        get { return _items.Count; }
    }

    public static IEnumerable<Item> GetAll()
    {
        return _items;
    }

    public static Item Get( string name )
    {
        return _items.SingleOrDefault( item => item.Name == name );
    }

    public static void Save( Item item )
    {
        if ( _items.Contains( item ) == false )
        {
            _items.Add( item );
        }
    }

    public static void Remove( Item item )
    {
        _items.Remove( item );
    }
}

Соответствующий фрагмент Page1.xaml

<TextBlock Text="Name:"
           Grid.Row="0"
           Grid.Column="0"
           HorizontalAlignment="Right"
           VerticalAlignment="Center"
           Margin="5" />

<TextBox x:Name="txtName"
         Grid.Row="0"
         Grid.Column="1"
         HorizontalAlignment="Stretch"
         VerticalAlignment="Center"
         Text="{Binding Name}" />

Page1.xaml.cs

public partial class ItemDetail : PhoneApplicationPage
{
    public ItemDetail()
    {
        InitializeComponent();
    }

    protected override void OnNavigatedTo( NavigationEventArgs e )
    {
        base.OnNavigatedTo( e );

        this.DataContext = ItemRepos.New();
    }

    private void Nav( object sender, EventArgs e )
    {
        NavigationService.Navigate( new Uri( "/Page2.xaml", UriKind.RelativeOrAbsolute ) );
    }

    private void Save( object sender, EventArgs e )
    {
        ItemRepos.Save( (Item) this.DataContext );
    }
}

Соответствующий фрагмент Page2.xaml

<controls:PivotItem Header="A-Z">
    <ListBox x:Name="listAZ"
             ItemsSource="{Binding}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</controls:PivotItem>

Page2.xaml.cs

public partial class ViewItems : PhoneApplicationPage
{
    public ViewItems()
    {
        InitializeComponent();
    }

    protected override void OnNavigatedTo( NavigationEventArgs e )
    {
        base.OnNavigatedTo( e );

        this.DataContext = ItemRepos.GetAll();
    }
}

1 Ответ

0 голосов
/ 12 февраля 2012

Не видя ни одного вашего кода, трудно точно знать, что происходит, но я попробую угадать.Если вы добавите код в свой вопрос, я могу быть более полезным.Вот список возможных проблем.

  • Список Foos на самом деле не статичен (глобально доступен для обеих страниц), и они ссылаются на разные списки.• успешно обновляет список Foos.
  • Если список Foos равен ObservableCollection, то где-то вы его устанавливаете более одного раза.
  • Если список Foos не является ObservableCollection, вы неправильно настраиваете привязку данных между двумя страницами.

Обновление: Попробуйте использовать следующее вместо _items в Item.cs.

public static ObservableCollection<Item> Items = new ObservableCollection<Item>();

Затем измените DataContext на странице 2, чтобы использовать коллекцию напрямую:

protected override void OnNavigatedTo( NavigationEventArgs e )
{
    base.OnNavigatedTo( e );

    this.DataContext = ItemRepos.Items;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...