listbox itemContainer仅包含边框

时间:2014-08-15 11:48:41

标签: c# xaml windows-phone-8

我正在尝试在列表的datatemplate中创建一个删除按钮,该按钮仅在用户单击应用程序栏中的按钮时显示。我正在使用可视化树来访问listcontainer中的元素,但它显示项容器只有一个border元素而没有别的 这是我的datatemplate xaml

 <DataTemplate>
     <StackPanel>
         <Grid>
             <Grid.ColumnDefinitions>
                 <ColumnDefinition Width="auto"/>
                 <ColumnDefinition Width="20"/>
                 <ColumnDefinition Width="auto"/>
                 <ColumnDefinition Width="*"/>
                 <ColumnDefinition Width="auto" />
             </Grid.ColumnDefinitions>
             <TextBlock Text="{Binding Id}" Grid.Column="0" Height="auto" Width="auto" FontSize="50"/>
             <TextBlock Text="{Binding Title}" Height="auto" Width="auto" FontSize="50" Grid.Column="2" TextWrapping="Wrap"/>
             <Image  Name="del" Source="/Assets/AppBar/delete.png" Grid.Column="4" Tap="delete_Tap" HorizontalAlignment="Stretch" Visibility="{Binding}"/>
         </Grid>
         <TextBlock Text="{Binding Data}" Height="auto" Width="auto" FontSize="30" TextWrapping="Wrap"/>
     </StackPanel>
 </DataTemplate>

这是可视树代码

private void ApplicationBarIconButton_Click(object sender, EventArgs e)
{
    foreach (var items in notes.Items)
    {
        var x = notes.ItemContainerGenerator.ContainerFromItem(items);
        var p = VisualTreeHelper.GetChildrenCount(x);
        MessageBox.Show(p.ToString());
    }
}

getchildrencount始终为1,即边框。如何从代码中访问图像?

1 个答案:

答案 0 :(得分:0)

看看这个link。这描述了如何选择放置在ListBox项目中的控件。

(或)

更好的解决方案可能是:

  1. 在ViewModel中创建一个布尔属性,并使用false初始化它。
  2. 在DataTemplate中设置Delete按钮,并将Delete Button的DataContext设置为ViewModel(每个UIElement都有自己的DataContext属性,因此您可以单独设置Button,它将覆盖ListBox DataContext。)
  3. 将Delete Button的Vis Visibility属性绑定到ViewModel中定义的布尔属性(使用Converter将bool值更改为Visibility值)。
  4. 当用户点击应用程序栏时,将布尔变量设置为true。