我需要一些帮助才能解决我遇到的简单的XAML绑定问题。
我使用2个类的MVVM模式。卡和董事会。我已经用卡片创建了一个模型。 Card类仅由两个属性组成。
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}}" ... />
什么是正确的绑定?
答案 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>