在一个项目(Prism,MVVM,Windows8.1 StoreApp)中,我有一个像这样的XAML:
<GridView
x:Name="grvLetters"
Grid.Row="1"
Margin="80,0,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top">
<Button x:Name="btnA"
Content="A"
Command="{Binding Letter_Clicked}"
CommandParameter="{Binding ElementName=btnA, Path=Content}"/>
<Button x:Name="btnB"
Content="B"
Command="{Binding Letter_Clicked}"
CommandParameter="{Binding ElementName=btnB, Path=Content}"/>
<Button x:Name="btnC"
Content="C"
Command="{Binding Letter_Clicked}"
CommandParameter="{Binding ElementName=btnC, Path=Content}"/>
<Button x:Name="btnD"
Content="D"
Command="{Binding Letter_Clicked}"
CommandParameter="{Binding ElementName=btnD, Path=Content}"/>
<Button x:Name="btnE"
Content="E"
Command="{Binding Letter_Clicked}"
CommandParameter="{Binding ElementName=btnE, Path=Content}"/>
<Button x:Name="btnF"
Content="F"
Command="{Binding Letter_Clicked}"
CommandParameter="{Binding ElementName=btnF, Path=Content}"/>
</GridView>
我想将它放在DataTemplate中,但是当我这样做时,该命令不会转发到ViewModel。这是我到目前为止所尝试的内容:
这就是我在模板中的内容(基于Daniel Sklenitzka的以下建议):
<DataTemplate x:Key="LetterButton">
<Button
x:Name="btnLetter"
Command="{Binding Letter_Clicked}"
CommandParameter="{Binding ElementName=grvLetters, Path=Content}"
/>
</DataTemplate>
这个建议不起作用,所以我改回了:
<DataTemplate x:Key="LetterButton">
<Button
x:Name="btnLetter"
Command="{Binding Letter_Clicked}"
CommandParameter="{Binding ElementName=btnLetter, Path=Content}"
/>
</DataTemplate>
为了拥有GridView的ItemsSource,我在ViewModel中添加了它:
Public Property Alfabet As String() = {"A", "B", "C", "D", "E", "F"}
GridView的XAML已更改为:
<GridView
x:Name="grvLetters"
ItemsSource="{Binding Alfabet}"
Grid.Row="1"
Margin="80,0,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
ItemTemplate="{Binding Source={StaticResource LetterButton}}"
>
不幸的是,这不会奏效。字母在视图上完美显示,但单击按钮时ViewModel中没有任何反应。
必须在viewmodel中捕获buttonclick(这不是问题,当我使用上面的第一个XAML时,在ViewModel中接收命令。
但是如何改进这种方法呢?有什么建议 ?非常欢迎。
再见
答案 0 :(得分:0)
当您使用ItemsSource和DataTemplates时,容器(在您的情况下为GridView)为ItemsSource集合中的每个元素创建模板的实例,并将该元素设置为此实例的DataContext。
这意味着Button的DataContext是一个字母,而且该字母没有属性Letter_Clicked,这就是绑定失败的原因。
尝试像这样绑定命令:
Command="{Binding DataContext.Letter_Clicked, ElementName=grvLetters}"