2011-01-13 13 views
1

我试图实现一些非常简单的操作,但是我在WPF的第一步中遇到了一些问题。我有一个名为Component的类,它有一个名为Vertices的属性。顶点是类型Point的通用列表。我想要的是将顶点属性绑定到列表框。这是在ListBox声明用我的XAML这段代码很简单:将通用列表绑定到列表框,并使用数据模式

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

棘手的部分是,当我试图创建列表框一个DataTemplate。我希望列表框的每一行显示一个带有顶点(Point.X,Point.Y)值和一个按钮的文本框,以允许我删除该项目。你能帮我解释数据模板的定义吗?下面的代码无法将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> 
+0

请给我一些代码背后的类和集合,也许这就是问题,也告诉我你在哪里设置DataContext,如果有的话。 – 2011-01-13 18:39:25

回答

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(标准的实现你的GUI中的列表将不会更新您可以使用:ObservableCollection<T>

编辑:常见绑定失败原因:
1.绑定源不是公共财产 - >让一个
2.结合的路径是不是绝对的,不存在的DataContext从
开始 - >设置在构造函数本身窗口的DataContext(this )或...
- >在绑定到你的窗口的名称,如果这是你的财产是

EDIT2设置的ElementName:如果您的收藏包括顶点,如果你Vertex类包含与一个点物业名称Point您需要将绑定更改为{Binding Point.X}{Binding Point.Y},请在下次发布更多的代码。

+0

我用上面的确切代码,它不显示任何东西。我应该保留我以前的代码为ListBox ItemSource绑定或我需要在那里进行更改? (我删除了转换器来测试你的代码) – muku 2011-01-13 18:02:53