Привязка внутри списка элементов списка проблем - PullRequest
3 голосов
/ 03 февраля 2011

У меня есть две отдельные проблемы связывания со списками с шаблонами элементов, которые содержат текстовое поле.

1) Один список связывается со списком строк. Как я могу отобразить каждую строку внутри созданных текстовых полей и разрешить двухстороннее связывание одновременно? Двухстороннее связывание недопустимо без указания пути или XPath.

<ListBox Height="231" HorizontalAlignment="Left" Margin="0,167,0,0" Name="listBoxKeys" VerticalAlignment="Top" Width="219" ItemsSource="{Binding Path=SelectedPlatform.Keys}" SelectedItem="{Binding Path=SelectedKey,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
         <ListBox.ItemTemplate>
              <DataTemplate>
                  <StackPanel Orientation="Horizontal" Margin="0,0,0,0">
                     <TextBox Text="{Binding Mode=OneWay}" Margin="0,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center"/>
                   </StackPanel>
               </DataTemplate>
          </ListBox.ItemTemplate>
 </ListBox>

И 2) я использую другой список, который привязывается к некоторому универсальному списку пользовательского класса KeyValuePair. Элемент шаблона содержит текстовое поле и поле со списком. Текст текстового поля привязывается к свойству ключа каждого объекта KeyValuePair, а выбранный элемент комбинированного списка - к свойству значения. Моя проблема в том, что я хочу, чтобы комбо заполнилось списком строк, объявленных в моей модели представления, которые будут меняться во время выполнения. Datacontext окна - это модель представления, в которой объявлен список. Я не знаю точный синтаксис, который мне нужно использовать, чтобы связать там источник элементов списка. Вот мой код:

<ListBox Height="393" HorizontalAlignment="Left" Margin="0,72,0,0" Name="listBoxActions" VerticalAlignment="Top" Width="254" ItemsSource="{Binding Path=SelectedPlayer.ControlProfile.MappedActions}">
    <ListBox.ItemTemplate>
      <DataTemplate>
        <StackPanel Orientation="Horizontal" Margin="0,0,0,0">
          <TextBox Text="{Binding Key, Mode=TwoWay,UpdateSourceTrigger=LostFocus}" Margin="10,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center"/>
          <ComboBox Margin="10,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center" ItemsSource="{Binding ?}" SelectedItem="{Binding Value, Mode=TwoWay}"/>
         </StackPanel>
        </DataTemplate>
       </ListBox.ItemTemplate>
</ListBox>

Ответы [ 2 ]

4 голосов
/ 03 февраля 2011

Проблема заключается в том, что двусторонняя привязка на самом источнике не может работать, поскольку это будет означать, что весь объект (строка), для которого создается шаблон данных, должен быть заменен, когда пользователь изменяет текст в текстовом поле.,Очевидно, это не будет работать.Двусторонняя привязка будет работать только для свойства записи связанного объекта.

В вашем случае я бы предложил создать модель представления для элементов в списке (в основном модель представления для ваших строк) и выставитьСвойство Value для него и привязка к нему в шаблоне данных:

<ListBox Height="231" HorizontalAlignment="Left" Margin="0,167,0,0" 
         Name="listBoxKeys" VerticalAlignment="Top" Width="219" 
         ItemsSource="{Binding Path=SelectedPlatform.KeyViewModels}" 
         SelectedItem="{Binding Path=SelectedKey,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
        <ListBox.ItemTemplate>
             <DataTemplate>
                 <StackPanel Orientation="Horizontal" Margin="0,0,0,0">
                    <TextBox Text="{Binding Value, Mode=TwoWay}" Margin="0,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center"/>
                  </StackPanel>
              </DataTemplate>
         </ListBox.ItemTemplate>
</ListBox>
2 голосов
/ 03 февраля 2011

1) Кажется, у Павла Глазкова хороший ответ

2) Дело в том, что DataContext для ComboBox теперь является парой ключ-значение, а не ViewModel. Могут быть и другие способы сделать это, но один из них, который я использовал ранее, - установить источник привязок RelativeSource обратно в его родительский ItemsControl.

RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}

Что-то вроде:

<ListBox Height="393" HorizontalAlignment="Left" Margin="0,72,0,0" Name="listBoxActions" VerticalAlignment="Top" Width="254" ItemsSource="{Binding Path=SelectedPlayer.ControlProfile.MappedActions}">
    <ListBox.ItemTemplate>
      <DataTemplate>
        <StackPanel Orientation="Horizontal" Margin="0,0,0,0">
          <TextBox Text="{Binding Key, Mode=TwoWay,UpdateSourceTrigger=LostFocus}" Margin="10,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center"/>
          <ComboBox Margin="10,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center" ItemsSource="{Binding DataContext.Keys,  RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" SelectedItem="{Binding Value, Mode=TwoWay}"/>
         </StackPanel>
        </DataTemplate>
       </ListBox.ItemTemplate>
</ListBox>
...