【问题标题】:WPF ListView with buttons on each lineWPF ListView,每行都有按钮
【发布时间】:2011-08-19 22:08:05
【问题描述】:

我有一个Games 列表,其中只有一个ID、一个Date 和一个Time。 我将此列表设置为DataContext

然后我有一个DataTemplate 用于这些游戏:

 <DataTemplate DataType="{x:Type loc:Game}">
     <Grid>
         <Grid.RowDefinitions>
             <RowDefinition Height="auto"></RowDefinition>
         </Grid.RowDefinitions>
         <Grid.ColumnDefinitions>
             <ColumnDefinition Width="100"></ColumnDefinition>
             <ColumnDefinition Width="100"></ColumnDefinition>
             <ColumnDefinition Width="100"></ColumnDefinition>
         </Grid.ColumnDefinitions>
         <TextBlock Name="dateBlock" Grid.Column="0" Grid.Row="1"
                    Text="{Binding Date,  StringFormat=d}"></TextBlock>
         <TextBlock Name="TimeBlock" Grid.Column="1" Grid.Row="1"
                    Text="{Binding Time}"></TextBlock>
         //need to but a button here for each row
     </Grid>
 </DataTemplate>

要使用模板,我只是这样做:

    <ListBox ItemsSource="{Binding}"></ListBox>    

我需要将Button 添加到此列表视图中具有相同单击事件的每一行,但会以某种方式传递正在单击的按钮的游戏的 ID。

我该怎么做?我被困住了。 如果这没有意义,请告诉我,我会尽力解释得更好。

【问题讨论】:

    标签: c# wpf xaml listview datatemplate


    【解决方案1】:

    对于第一部分,将Button 添加到DataTemplate 并订阅Click 事件

    <DataTemplate DataType="{x:Type loc:Game}">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="auto"></RowDefinition>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="100"></ColumnDefinition>
                <ColumnDefinition Width="100"></ColumnDefinition>
                <ColumnDefinition Width="100"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <TextBlock Name="dateBlock" Grid.Column="0" Grid.Row="1" Text="{Binding Date,  StringFormat=d}"></TextBlock>
            <TextBlock Name="TimeBlock" Grid.Column="1" Grid.Row="1" Text="{Binding Time}"></TextBlock>
            <Button Click="Button_Click">X</Button>
        </Grid>
    </DataTemplate>
    

    在事件处理程序后面的代码中,您可以获取点击的ButtonDataContext 并找出Id like

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Button button = sender as Button;
        Game game = button.DataContext as Game;
        int id = game.ID;
        // ...
    }
    

    【讨论】:

    • 你是说 Grid.Row="0" 吗?
    【解决方案2】:

    很容易。将Button 添加到您的DataTemplate,给它一个Command,然后设置CommandParameter="{Binding}"。 DataTemplate 中的 DataContext 是对象。

    根据要求,一些使用命令的链接。

    HTH,

    【讨论】:

    • 这是一个更简洁的解决方案。由于我一直在编写 MVVM 代码,我什至认为在代码后面使用事件处理程序(即 xaml.cs)。真是太好了。
    • Dennis,如何执行命令绑定的其余部分(或至少是现有绑定的链接)的代码示例对您的回答非常有帮助。在这些情况下,我也更喜欢将 Commands 与使用 Binding 的参数一起使用。
    • @Ether:我通常会在需要时将一个示例放在一起,但是由于命令是涵盖如此广泛的主题,我将进行 Google 搜索并在我的答案中添加一些更好的结果。
    • 谢谢大家,这可能更整洁,但我对命令感到困惑。我稍后可能会更改它,但现在其他答案对我来说更容易:) 谢谢!
    【解决方案3】:

    使用 ListBox.ItemTemplate。然后在您的点击事件中,您可以通过 DataContext 获取对象。

        <ListBox.ItemTemplate>
            <DataTemplate>
                <Button Content="^" IsEnabled="{Binding Path=IsNotFirst, Mode=OneWay}" 
                 Click="btnMoveFDAup"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    
    
        private void btnMoveFDAup(object sender, RoutedEventArgs e)
        {
            Button btn = ((Button)sender);
            // btn.DataContext will get you to the row object where you can retrieve the ID
        }
    

    【讨论】:

    • 如何从 btn.DataContext 获取值?例如,在调试器中,我可以看到 btn.DataContext 指向我的数据类 (LVDATA),而我需要的是字符串 Name 中的值。我如何访问它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2017-01-12
    • 2018-01-23
    相关资源
    最近更新 更多