WPF ItemSource не работает в XAML

Я пишу шахматный интерфейс в WPF.

Я установил контекст данных окна в XAML:

<Window.DataContext>
    <local:MainViewModel />
</Window.DataContext>

Я определил «локальное» пространство имен как пространство имен, которое содержит модель представления.

xmlns:local="clr-namespace:ChessUI"

Модель представления имеет 1 свойство, набор шахматных фигур:

public class MainViewModel
{
    public ObservableCollection<ChessPiece> ChessPieces { get; set; }

    public MainViewModel()
        :this(new ObservableCollection<ChessPiece>())
    {
    }

    public MainViewModel(IEnumerable<ChessPiece> chessPieces)
    {
        this.ChessPieces = new ObservableCollection<ChessPiece>(chessPieces);
    }
}

Я пытался связать ChessPieces с моим ChessBoard (ItemsControl) следующим образом:

<Viewbox RenderOptions.BitmapScalingMode="HighQuality">
    <ItemsControl Name="ChessBoard" ItemsSource="{Binding ChessPieces}">
        [...]
    </ItemsControl>
</Viewbox>

Но он не показывает фрагменты во время выполнения. Однако, если я раскомментирую строку ниже, это сработает, и я увижу все фигуры на доске.

public MainWindow()
{
    InitializeComponent();
    var viewModel = new MainViewModel(this.GetStartingPositionChessPieces());
    //this.ChessBoard.ItemsSource = viewModel.ChessPieces;
}

Просто быть чистым:

С привязкой, установленной в XAML:

Нет фрагментов!

С привязкой, установленной в коде:

Кусочками!

Кто-нибудь знает, что я делаю неправильно с привязкой XAML?


person PeteGO    schedule 09.06.2014    source источник


Ответы (2)


В вашем примере кода

public MainWindow()
{
    InitializeComponent();
    var viewModel = new MainViewModel(this.GetStartingPositionChessPieces());
    //this.ChessBoard.ItemsSource = viewModel.ChessPieces;
}

Вы создаете модель представления, но не используете ее. Возможно, если вы назначили его как DataContext окна:

this.DataContext = viewModel;
person Aaron    schedule 09.06.2014

На первый взгляд, я считаю, что вам нужно создать экземпляр ViewModel и установить его DataContext при создании экземпляра представления. Замените строку

var viewModel = new MainViewModel(this.GetStartingPositionChessPieces());

с участием

this.DataContext = new MainViewModel(this.GetStartingPositionChessPieces());

Потому что

<Window.DataContext>
<local:MainViewModel />

Will just be using the zero argument constructor and not setting up your pieces).

Обратите внимание, DataContext — это не то же самое, что ItemSource.

Надеюсь это поможет

person Matthew Trout    schedule 09.06.2014