如何在模板中放置重复按钮而不会丢失功能

时间:2014-08-29 08:48:01

标签: mvvm command datatemplate

在一个项目(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中接收命令。

但是如何改进这种方法呢?有什么建议 ?非常欢迎。

再见

1 个答案:

答案 0 :(得分:0)

当您使用ItemsSource和DataTemplates时,容器(在您的情况下为GridView)为ItemsSource集合中的每个元素创建模板的实例,并将该元素设置为此实例的DataContext。

这意味着Button的DataContext是一个字母,而且该字母没有属性Letter_Clicked,这就是绑定失败的原因。

尝试像这样绑定命令:

Command="{Binding DataContext.Letter_Clicked, ElementName=grvLetters}"