WPF将属性绑定到对象列表

时间:2014-07-21 03:39:08

标签: c# wpf xaml mvvm

我需要一些帮助才能解决我遇到的简单的XAML绑定问题。

我使用2个类的MVVM模式。卡和董事会。我已经用卡片创建了一个模型。 Card类仅由两个属性组成。

     
  1. 我的卡的价值。
  2.  
  3. 我的卡的状态(下行或上行)。该板包含一系列卡片。
  4. 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
        }
    }
    

    之后我在卡片和电路板属性上添加了所有INotifyPropertyChanged内容。我没有向您展示尽可能保持清晰的代码。

    在我的ViewModel我只露出这个:

    public Board GameBoard { get; set; }
    

    当然,我有很多其他的方法,属性和命令,但没有任何关于卡。我的游戏规则和我的牌都在我的董事会课程中。我的ViewModel只公开特定于我的XAML设计的类。

    在我的XAML文件中,我有类似的东西。卡片是一个简单的矩形。我只需要使用正确的转换器将我的卡的值与Fill属性绑定。我认为只是暴露我的董事会所以我需要写一些像

    这样的东西
    Fill="{Binding **GameBoard.CardList[0]** 
    

    我不会在运行时生成矩形。现在我在我的主板上有4张卡然后我写了4次Rectangle代码并硬编码4次结束01,02,03,04。我只是在这里给你看01:

    <Window.Resources>
        <me:CardFillConverter x:Key="CardConverter"/>
    </Window.Resources>
    
    <Rectangle x:Name="Card01" Fill="{Binding ??? Converter={StaticResource CardConverter}}" ... />
    

    什么是正确的绑定?

3 个答案:

答案 0 :(得分:1)

在转换器中做你的技巧。

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

答案 1 :(得分:0)

如果您的viewmodel中有卡片列表,那么您可能需要以某种方式在视图中显示所有卡片?用索引器逐一获取它们似乎没有意义。那么你可能应该使用类似的东西:

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

答案 2 :(得分:0)

你去吧

您可以利用ItemsControl代替卡的硬编码,并为卡的外观和行为指定数据模板

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

您也可以选择应用ItemsPanelTemplate来定义卡位置布局

例如

<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>