0

我正在 WPF 中编写国际象棋 UI。

我在 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 绑定中做错了什么?

4

2 回答 2

2

乍一看,我相信您需要在实例化视图时实例化 ViewModel 并设置其 DataContext .. 替换该行

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

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

因为

<Window.DataContext>
<local:MainViewModel />

只会使用零参数构造函数而不是设置你的作品)。

请注意,DataContext 与 ItemSource 不同。

希望这可以帮助

于 2014-06-09T15:28:19.733 回答
1

在您的代码示例中,

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

您正在创建一个 viewModel 但没有使用它。也许如果您将其分配为窗口的 DataContext:

this.DataContext = viewModel;
于 2014-06-09T15:25:11.137 回答