私はNine Men's Morrisボードゲームを作成し、MVVMを初めて利用しようとしています。ゲームでは、ゲームの開始時に各プレーヤーの残っているゲームピースを表示し、各プレーヤーの正しい色でGameBoardViewModelにそれらを設定したいと思います。次に、ボードにピースが追加されるたびにObservableCollectionをそれに応じて更新します。ViewModelsのObservableCollectionを作成し、コードからDataTemplate値をオーバーライドする
問題はObservableCollectionを実装するときにゲームボードのビューモデルから各ゲームの色プロパティを正しく設定できないことです。私は私のViewModel用の私のDataTemplateは、viewmodelのコードで設定された値をオーバーライドし、色は決して決してないと思います。
Colorプロパティは、私のGamePieceのViewModelで定義され、INotifyPropertyChangedインターフェイスを実装しています。 DataTemplateから設定されるSizeプロパティは、正常に動作します。
私gamepieceは、基本的には、楕円形のように見えるようにオーバーライドし、デフォルトのスタイルを持つチェックボックスである:私のGameBoardViewModelで
d:DesignHeight="300" d:DesignWidth="300" Margin="-1000000" Width="{Binding Size}" Height="{Binding Size}">
<UserControl.Resources>
<Style TargetType="CheckBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type CheckBox}">
<Grid>
<Ellipse Stroke="Black" Fill="{Binding Path=Color, Mode=TwoWay}" x:Name="OuterEllipse">
<Ellipse.BitmapEffect>
<BevelBitmapEffect BevelWidth="8" EdgeProfile="BulgedUp" Smoothness="0.745"/>
</Ellipse.BitmapEffect>
</Ellipse>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<Grid Name="root">
<CheckBox >
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<i:InvokeCommandAction Command="{Binding ClickPieceCmd}" CommandParameter="{Binding ActionName}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</CheckBox>
</Grid>
私が持っている:
private void CreateHeaderGamePieces()
{
PlayersPieces = new ObservableCollection<GamePieceViewModel>();
for (int pieceCount = 0; pieceCount < _maxPieceCount; pieceCount++)
{
GamePieceViewModel gamePiece = new GamePieceViewModel();
gamePiece.Color = "Black";
if (pieceCount > 9)
{
gamePiece.Color = "Red";
}
PlayersPieces.Add(gamePiece);
}
}
私のGameBoardResources.xamlには私が持っています:私が持っている私のGameBoardView.xamlで
<DataTemplate DataType="{x:Type vm:GamePieceViewModel}">
<vw:GamePieceView Size="15"/>
</DataTemplate>
:
<ListView ScrollViewer.HorizontalScrollBarVisibility="Disabled" Height="90"
ItemsSource="{Binding PlayersPieces}" DockPanel.Dock="Left">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="9"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
これは、それがのObservableCollectionを移入した後、今どのように見えるかです:私は定義することができますどのように ListView of gamepieces
ObservableCollectionにデータを埋め込むとき、私のGameBoardViewModelから各ピースの色?
を 'GamePieceView'色プロパティのいくつかの種類を持つべきである(例えば'Background')を使用して、ビューモデルのColorプロパティにバインドされます。ビューモデルのColorプロパティの型として 'string'の代わりに' Brush'を使用することができます。 – Clemens
そのSizeプロパティは、GamePieceViewのDependencyPropertyであり、GamePieceのviewModelの対応するプロパティにバインドされています。しかし、GameBoardViewModelのコードからそれを設定しようとしても、それは機能しません。"Size"プロパティを機能させるためには、DataTemplateで定義する必要があります。 – Makezu
GamePieceViewはDataContextを明示的に設定するため、ListViewItemからDataContextを継承することができなくなります。 – Clemens