Привязать общий список к списку, а также использовать табличку с данными - PullRequest
1 голос
/ 13 января 2011

Я пытаюсь реализовать что-то довольно простое, но я делаю первые шаги в WPF и у меня возникают некоторые проблемы.У меня есть класс с именем Компонент, который имеет свойство под названием Вершины.Вершины - это общий список типа Point.Я хочу связать свойство вершин со списком.Это легко сделать, используя этот код в моем XAML в объявлении списка:

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

Сложная часть, когда я пытаюсь создать таблицу данных для списка.Я хочу, чтобы в каждой строке списка отображалось текстовое поле со значениями вершины (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>

1 Ответ

1 голос
/ 13 января 2011

Примерно так:

<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 (Standard-реализацию, которую вы можете использовать: ObservableCollection<T>)

Редактировать: Распространенные причины сбоя привязки:1. Связанный источник не является публичной собственностью -> сделайте его одним2. Путь привязки не является абсолютным и отсутствует DataContext для начала-> Установить DataContext вашего окна в конструкторе себе (this) или ...-> Установите ElementName в Привязке к имени вашего окна, если это где ваша собственность

Edit2: если ваша коллекция состоит из вершин и если ваш класс Vertex содержит точку с именем свойства Point, вам нужно изменить привязки на {Binding Point.X} и {Binding Point.Y}, напишите больше кодав следующий раз, пожалуйста.

...