DataTemplate中的绑定命令

时间:2016-09-22 15:10:42

标签: c# wpf xaml mvvm uwp

我用MVVM模式制作了UWP应用程序(我想是这样:)) 我的应用程序有listbox的数据模板。 View.xaml中的ListBox:

<ListBox x:Name="lbMySongs" ItemsSource="{Binding Path=MySongs}" ItemTemplate="{StaticResource lbSongsTemplate}" Grid.Row="1">
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            </Style>
        </ListBox.ItemContainerStyle>
</ListBox/>

DateTemplate资源:

       <DataTemplate x:Key="lbSongsTemplate">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto"/>
                <ColumnDefinition Width="auto"/>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="auto"/>
                <ColumnDefinition Width="auto"/>
            </Grid.ColumnDefinitions>
            <TextBlock Text="{Binding Path=Artist}" Grid.Column="0"/>
            <TextBlock Text=" - " Grid.Column="1"/>
            <TextBlock Text="{Binding Path=Title}" Grid.Column="2"/>
            //Here i bind command, but it's not binding cos ItemsSource have no command. ViewModel have this command.
            <Button Command="{Binding Path=DownloadCommand}" Content="{Binding Path=Query}"/>
            <TextBlock Text="{Binding Duration}" Grid.Column="5" HorizontalAlignment="Right"/>
        </Grid>
       </DataTemplate>

需要为此按钮设置DataContext。 我在ViewModel中的命令。例如:

class ViewModel
{
    ...
    public RelayCommand DownloadCommand { get; set; }
    public ObservableCollection<SomeClass> MySongs { get; set; }
    ...
}

我的问题:DataTemplate有ItemsSource = ViewModel.MySongs。但是“DownloadCommand”在ViewModel中。 我在DataTemplate中为我的按钮设置绑定到DownloadCommand的内容是什么?

2 个答案:

答案 0 :(得分:3)

使用RelativeSource绑定表示您要绑定到ListBox.DataContext.DownloadCommand

<Button Command="{Binding Path=DataContext.DownloadCommand, 
                          RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}" 
        Content="{Binding Path=Query}"/>

这样的常见做法是将CommandParameter绑定到项目以了解命令执行的项目:

<Button Command="{Binding Path=DataContext.DownloadCommand, 
                          RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}" 
        CommandParameter="{Binding }"
        Content="{Binding Path=Query}" />

你也可以使用ElementName绑定,但是你必须在你的DataTemplate中指定你的ListBox名称,我个人不想硬编码ElementName我的DataTemplates。如果你改变某些东西的名字,或者想在另一个ListBox中使用DataTemplate,那么找到并修复会很烦人。

答案 1 :(得分:2)

尝试使用:

<Button Command="{Binding Path=DataContext.DownloadCommand, ElementName=lbMySongs}"
        CommandParameter="{Binding}"
        Content="{Binding Path=Query}"/>

并改变

public RelayCommand DownloadCommand { get; set; }

public RelayCommand<SomeClass> DownloadCommand { get; set; }
...
DownloadCommand = new RelayCommand<SomeClass>(DownloadExecute);
...
private voir DownloadExecute(SomeClass item)
{
    ...
}