XAML-связывание вложенной структуры из ObservableCollection <T> - PullRequest
1 голос
/ 13 марта 2012

Я создаю приложение для Windows Phone и пытаюсь связать ObservableCollection с вложенной структурой без успеха.

MyViewModel.cs

public class MyViewModel : PropertyChangedBase
{
    private Player _Player1;
    public Player Player1
    {
        get { return _Player1; }
        set
        {
            if (!value.Equals(_Player1))
            {
                _Player1 = value;
                NotifyOfPropertyChange(() => Player1);
            }
        }
    }
    private Player _Player2;
    public Player Player2
    {
        get { return _Player2; }
        set
        {
            if (!value.Equals(_Player2))
            {
                _Player2 = value;
                NotifyOfPropertyChange(() => Player2);
            }
        }
    }
    public struct Player
    {
        public string Name;
        public bool IsWinner;
    }
}

MyPageViewModel.cs

public class MyPageViewModel : Screen
{
    public ObservableCollection<MyViewModel> Matches { get; private set; }
    public MyPageViewModel()
    {
        this.Matches = new ObservableCollection<MyViewModel>();
        LoadData();
    }
    public void LoadData()
    {            
        // Matches
        this.Matches.Add(new MyViewModel()
        { 
            Player1 = new MyViewModel.Player
            { Name = "Jhonn", IsWinner = false },
            Player2 = new MyViewModel.Player
            { Name = "Marrie", IsWinner = true }
        });
    }
}

MyPage.xaml

<ListBox Margin="0,0,-12,0" ItemsSource="{Binding Matches}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Margin="0,0,0,17" Width="432">
                <TextBlock Text="{Binding Player1.Name}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                <TextBlock Text="{Binding Player2.Name}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>


У меня нет ошибки привязки, но имена игроков не отображаются. У меня всегда пустой экран.

1 Ответ

1 голос
/ 13 марта 2012

Ваша проблема здесь:

public struct Player
{
    public string Name;
    public bool IsWinner;
}

Чтобы быть связанным, Имя должно быть свойством.Сделайте Player классом и выставьте Name в качестве свойства класса, и вы получите золотой статус:

public class Player
{
     public string Name {get; set;}
     public bool IsWinner {get;set;}
}

У вас должно получиться уйти без реализации INotifyPropertyChanged, если вы установите их только один раз.Если они собираются измениться, продолжайте внедрять INPC.

...