确定存在哪个ListViewItem复选框

时间:2009-12-15 10:23:28

标签: c# wpf checkbox

我看到了一些关于此的事情,但我现在已经失去了它,再也找不到了。我需要知道当复选框被选中时(哪个最终会导致其删除),知道哪个ListViewItem存在复选框,

我试过让父母,但显然这不起作用。

XAML:

<ListView Name="incomingMessages" Extensions:ListViewColumns.Stretch="true"
  Height="226" Canvas.Left="0" Canvas.Top="0" Width="755" ItemsSource="{Binding Messages}">
  <ListView.View>
    <GridView>
      <GridViewColumn Header="Time" Width="100" DisplayMemberBinding="{Binding Time}" />
      <GridViewColumn Header="Message" DisplayMemberBinding="{Binding FullMessage}"  />
      <GridViewColumn Header="Phone Number" DisplayMemberBinding="{Binding Number}" Width="85"  />
      <GridViewColumn Header="Done" Width="45">
        <GridViewColumn.CellTemplate>
          <DataTemplate>
            <CheckBox IsChecked="{Binding Done}" VerticalAlignment="Center" />
          </DataTemplate>
        </GridViewColumn.CellTemplate>
      </GridViewColumn>
    </GridView>
  </ListView.View>
</ListView>

在Checked事件中需要使用哪种代码才能使其正常工作? (作为一个附带问题,为什么我的VerticalAlignment没有居中对齐列中的复选框?)

就像我说过我在这种代码中尝试过父母

        private void CheckBox_Checked(object sender, RoutedEventArgs e)
        {
            CheckBox cb = (CheckBox)sender;
            object lv = cb.parent;
        }

如果我在cb.parent行上断点,则cb.parent为null。

谢谢, PSY

2 个答案:

答案 0 :(得分:0)

您可以使用VisualTreeHelper走可视树,找到ListViewItem。但是,如果可能的话,我建议不要采用这种方法。很可能使用其他WPF功能(如数据绑定)来实现您的目标。

答案 1 :(得分:0)

好的,我所做的就是做到这一点

<CheckBox IsChecked="{Binding Done}"
  Uid="{
    Binding Path=Items.Count,
    Mode=OneTime,
    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}
  }"
  Checked="CheckBox_Checked"
  VerticalAlignment="Center"
  HorizontalAlignment="Center" />

哪个有效(除了添加的前三个,因为它们在运行时添加并且似乎绕过它,但是在实时版本中不会发生这样就好了。但是后来我发现这会导致问题删除后,由于Uid将被维护,但DataSource将无法匹配。所以想法?