来自ObservableCollection <t> </t>的XAML绑定嵌套结构

时间:2012-03-13 13:25:24

标签: binding struct nested observablecollection windows-phone

我正在构建Windows Phone应用程序,我正在尝试使用嵌套struct绑定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 个答案:

答案 0 :(得分:1)

你的问题在这里:

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

为了绑定,Name必须是一个属性。让玩家成为一个类并将Name作为一个属性暴露在类中,你将是金色的:

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

只要您只设置一次,就可以在不实施INotifyPropertyChanged的情况下逃脱。如果他们要改变,请继续实施INPC。