将通用列表绑定到列表框并使用datatemplate

时间:2011-01-13 17:32:00

标签: wpf data-binding datatemplate

我正在尝试实现一些非常简单的东西,但我正在WPF的第一步,我遇到了一些问题。我有一个名为Component的类,它有一个名为Vertices的属性。顶点是Point类型的通用列表。我想要的是将顶点属性绑定到列表框。通过在列表框声明中的XAML中使用此代码,这很容易:

ItemsSource="{Binding Path=Component.Vertices, Mode=OneWay, Converter={StaticResource verticesconverter},UpdateSourceTrigger=PropertyChanged}"

棘手的部分是当我尝试为列表框创建数据窗口时。我希望列表框的每一行都显示一个文本框,其中包含Vertex(Point.X,Point.Y)的值和一个允许我删除该项的按钮。你能帮我解决一下datatemplate定义吗?下面的代码不能将X,Y值绑定到两个单独的文本框中。你能指出我的错误,为什么文本框中没有显示任何内容?

    <ListBox ItemsSource="{Binding Path=Component.Vertices, Mode=OneWay,UpdateSourceTrigger=PropertyChanged}">
   <ListBox.ItemTemplate>
       <DataTemplate>
          <StackPanel Orientation="Horizontal" Margin="0,10,0,0">
             <TextBox Text="{Binding X}" MinWidth="35" MaxWidth="35"/>
             <TextBox Text="{Binding Y}" MinWidth="35" MaxWidth="35"/>
           </StackPanel>
       </DataTemplate>
    </ListBox.ItemTemplate>
    /ListBox>

1 个答案:

答案 0 :(得分:1)

这样的事情:

<ListBox ... Grid.IsSharedSizeScope="True">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <Grid>
        <Grid.ColumnDefinitions>
          <ColumnDefinition SharedSizeGroup="A"/>
          <ColumnDefinition SharedSizeGroup="B"/>
          <ColumnDefinition SharedSizeGroup="C"/>
        </Grid.ColumnDefinitions>
        <Grid.Children>
          <TextBlock Grid.Column="0" Text="{Binding X}" Margin="5"/>
          <TextBlock Grid.Column="1" Text="{Binding Y}" Margin="5"/>
          <Button Grid.Column="2" Tag="{Binding}" Margin="5" Click="Button_Click" Content="Remove"/>
        </Grid.Children>
      </Grid>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

事件处理程序:

private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
{
  Button senderB = (Button)sender;
  Point pt = (Point)senderB.Tag;
  Collection.Remove(pt);
}

注意:除非您的绑定集合实现INotifyCollectionChanged(您可以使用标准实现:ObservableCollection<T>

,否则GUI中的列表不会更新

编辑:常见的绑定 - 失败原因:
1.绑定来源不是公共财产 - &gt;让它成为一个 2.绑定路径不是绝对的,没有DataContext从中开始 - &GT;在构造函数中将窗口的DataContext设置为自身(this)或...
- &GT;将Binding中的ElementName设置为窗口名称(如果属性为

Edit2:如果您的集合包含顶点,并且您的Vertex类包含属性名称为Point的点,则需要将绑定更改为{Binding Point.X}和{{1} ,请在下次发布更多代码。