2014-07-21 4 views
0

J'ai besoin d'aide pour résoudre un problème de liaison XAML simple. J'utilise un modèle MVVM avec 2 classes. Carte et conseil. J'ai déjà créé un modèle avec une carte. La classe Card est composée de deux propriétés uniquement.WPF lier une propriété à une liste d'objets

  1. La valeur de ma carte.
  2. L'état de ma carte (vers le bas ou à l'envers). Le tableau contient une liste de cartes.
public class Card 
{ 
    public int Value { get; private set; } 
    public bool Upside { get; set; } 

    public Card(int value) 
    { 
     this.Value = value; 
    } 
} 

class Board 
{ 
    private List<Card> _cardList = new List<Card>(); 
    public List<Card> CardList 
    { 
     get 
     { 
      return _cardList; 
     } 
     set 
     { 
      if (_cardList == value) 
      { 
       return; 
      } 
      _cardList = value; 
      raisePropertyChanged("CardList"); 
     } 
    } 

    public void Initialize() 
    { 
     // Initialization of the card list 
    } 

    public void FlipCard() 
    { 
     // The rules and actions of my game 
    } 
} 

Après que j'ajouté tous les trucs INotifyPropertyChanged sur ma carte et les propriétés du conseil. Je ne vous montre pas le code pour rester aussi clair que possible.

Sur mon ViewModel j'expose seulement ceci:

public Board GameBoard { get; set; } 

Bien sûr, j'ai beaucoup d'autres méthodes, la propriété et la commande, mais rien sur la carte. La règle de mon jeu et mes cartes sont toutes dans ma classe Board. Mon ViewModel expose uniquement des classes spécifiques à mon design XAML.

Dans mon fichier XAML, j'ai quelque chose comme ça. Une carte est un rectangle simple. J'ai juste besoin de lier la valeur de ma carte avec la propriété Fill avec le bon convertisseur. La réflexion est que j'expose que mon conseil, alors je dois écrire quelque chose comme

Fill="{Binding **GameBoard.CardList[0]** 

Je ne produis pas mes rectangles à l'exécution. En ce moment j'ai 4 carte sur ma planche, puis je l'ai écrit 4 fois le code Rectangle et hardcoded 4 fois le nom se termine par 01, 02, 03, 04. Je viens de vous montrer ici le 01:

<Window.Resources> 
    <me:CardFillConverter x:Key="CardConverter"/> 
</Window.Resources> 

<Rectangle x:Name="Card01" Fill="{Binding ??? Converter={StaticResource CardConverter}}" ... /> 

Qu'est-ce la bonne liaison?

+0

@Alex Nous vous remercions de vos corrections –

Répondre

0

Si vous avez une liste de cartes dans votre viewmodel, alors vous devez probablement les afficher toutes dans votre vue? Il semble absurde de les avoir un par un avec les indexeurs. alors vous devriez peut-être utiliser quelque chose comme:

<ItemsControl ItemsSource="{Binding CardList}"> 
<ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Rectangle Fill="{Binding, Converter={StaticResource CardConverter}}"/> 
     </DataTemplate> 
</ItemsControl.ItemTemplate> 
</ItemsControl> 
0

ici vous allez

Au lieu de coder dur pour carte que vous pouvez exploiter ItemsControl et spécifiez un modèle de données pour l'apparence et le comportement de la carte

<ItemsControl ItemsSource="{Binding GameBoard.CardList}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Rectangle Fill="{Binding Value,Converter={StaticResource CardConverter}}"/> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

vous pouvez également choisir d'appliquer un ItemsPanelTemplate pour définir la disposition des emplacements de carte

par exemple

<ItemsControl ItemsSource="{Binding GameBoard.CardList}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel IsItemsHost="True" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Rectangle Fill="{Binding Value,Converter={StaticResource CardConverter}}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+0

se demandant si cela a fonctionné pour vous? – pushpraj

1

Faites votre tour dans le convertisseur.

<Rectangle x:Name="Card01" Fill="{Binding GameBoard.CardList Converter={StaticResource CardConverter} ConverterParameter = 0}" ... /> 
Questions connexes