2009-09-29 1 views
2

Вызов всех экспертов WPF!WPF: список списка с несколькими источниками

Я конвертирую приложение, которое я создал для создания символов для определенной RPG из Window Forms в WPF. По большей части программа намного проще в форме WPF; однако, я не могу представить эту часть для жизни меня.

У меня есть база данных, которая содержит список навыков, которые может принять персонаж. Эта база данных не содержит символов - обновление символов не изменит базу данных. Пользователь может добавлять новые навыки в базу данных, если они этого хотят, но это отдельно от создания персонажа. В окне создания персонажа у меня есть ListView, чтобы показать навыки, перечисленные в базе данных. Щелчок по строке в ListView обновляет текстовое поле описания и элемент управления Image - все это работает отлично.

Символ хранится в классе символов; который содержит список навыков, которые принял персонаж. Этот список не содержит всех навыков в базе данных, поэтому пользователь может обменять этот символ между приложениями с измененными базами данных без проблем.

Я хочу отобразить некоторые поля из класса символов и некоторые поля из базы данных в том же ListView. Например,

Имя (базы данных), уровень (символ), Score (символ), MaxTakenCount (база данных)

То, что я хочу добиться: список навыков персонажа будет иметь нулевые навыки до тех пор, пока пользователь не поднимает Значение «Уровень» для значения больше единицы. Изменение «Уровня» создаст экземпляр этого навыка и сохранит его в списке навыков персонажа. Оценка рассчитывается с использованием формулы, хранящейся в базе данных для этого навыка (та же таблица, что и Name, MaxTakenCount). Установка «Уровень» обратно в ноль удаляет навык из списка навыков персонажа. Если повезет, значения будут двухсторонними, поэтому я могу использовать undo/redo. (Undo queue хранит сериализованные копии объекта символа всякий раз, когда делается изменение.)

Насколько возможен этот WPF? Я не знаю, как жонглировать строку базы данных и список навыков персонажа, чтобы делать то, что я хочу. Вот что я до сих пор. Примечание: привязки «Оценка и уровень» не работают, поскольку я не знаю, как правильно ссылаться на список навыков. Список навыков - это контекст данных вкладки, содержащей ListView. Элемент ItemSource ListView установлен в «SkillTable» за кулисами.

<ListView Name="listSkills" Margin="10" Grid.Row="2" IsSynchronizedWithCurrentItem="True" Background="#AAFFFFFF" FontSize="14"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Name"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding Name, Mode=TwoWay}" Margin="5" /> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
      <GridViewColumn Header="Score"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding Score, Mode=TwoWay}" Margin="5" /> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
      <GridViewColumn Header="Level"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <ListBox SelectedIndex="{Binding Level, Mode=TwoWay}"> 
          <ListBox.Style> 
           <Style TargetType="ListBox"> 
            <Setter Property="ItemsPanel"> 
             <Setter.Value> 
              <ItemsPanelTemplate> 
               <StackPanel Orientation="Horizontal" Margin="5,0" HorizontalAlignment="Left" /> 
              </ItemsPanelTemplate> 
             </Setter.Value> 
            </Setter> 
           </Style> 
          </ListBox.Style> 
          <ListBoxItem Width="15"> </ListBoxItem> 
          <ListBoxItem Width="15">S</ListBoxItem> 
          <ListBoxItem Width="15">T</ListBoxItem> 
          <ListBoxItem Width="15">M</ListBoxItem> 
         </ListBox> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
     </GridView> 
    </ListView.View> 
</ListView> 

ListView заполняется каждой строкой в ​​базе данных. Столбцы базы данных правильно заполнены; однако, поля символов не являются. Пожалуйста, помогите этому новичку WPF !!

ответ

1

Попробуйте взглянуть на это с другой точки зрения. Свойство ListView.ItemsSource может связываться с одним элементом коллекции. Итак, сначала создайте класс, который инкапсулирует все значения, которые вы хотите отобразить в ListView. Затем создайте ObservableCollection<YourClass> и заполните все значения из базы данных, а другие значения могут быть заполнены кодом или позже из пользовательского интерфейса. Затем привяжите эту коллекцию к свойству ListView.ItemsSource, и все будет работать так, как вы хотите.

Ох ... только что заметил дату публикации. Хорошо, надеюсь, это поможет кому-то другому.

Смежные вопросы