2011-01-13 18 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