2015-02-12 3 views
2

В WPF У меня есть ListView кто есть ItemSource привязан к ObservableCollection:WPF: Привязка Вне ObservableCollection в ListView в

<ListView ItemsSource="{Binding Path=TestList, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"> 

TestList представляет собой коллекцию типа TestCase, который имеет несколько членов. Это отлично подходит для заполнения столбцов ListView информацией из членов TestList, но мне также необходимо получить доступ к свойствам вне коллекции.

Существует ComboBox (вне ListView), который изменяет, какие элементы управления отображаются в определенных столбцах. Я пытался сделать это с установкой DataTrigger на свойстве Видимости:

<GridViewColumn Header="Area" Width="100"> 
    <GridViewColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Path=Area}"> 
       <TextBlock.Style> 
        <Style TargetType="{x:Type TextBlock}"> 
         <Style.Setters> 
          <Setter Property="Visibility" Value="Visible"/> 
         </Style.Setters> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding Path=IdentitySelection}" Value="Test Management"> 
           <Setter Property="Visibility" Value="Collapsed"/> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </TextBlock.Style> 
      </TextBlock> 
     </DataTemplate> 
    </GridViewColumn.CellTemplate> 
</GridViewColumn> 

У меня также есть несколько других мест, где мне нужны привязки снаружи TestList (например, заполнение ComboBoxes в CellTemplates). Тем не менее, ListView, похоже, не получает данные из ничего вне ItemSource.

Я попытался двигаться TestList и IdentitySelection в один класс (TestManager), заявив, что в качестве одного, большой собственности, и переплета к этому:

<ListView ItemsSource="{Binding Path=TestManager, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Area" Width="100"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding Path=TestList.Area}"> 
          <TextBlock.Style> 
           <Style TargetType="{x:Type TextBlock}"> 
            <Style.Setters> 
             <Setter Property="Visibility" Value="Visible"/> 
            </Style.Setters> 
            <Style.Triggers> 
             <DataTrigger Binding="{Binding Path=IdentitySelection}" Value="Test Management"> 
              <Setter Property="Visibility" Value="Collapsed"/> 
             </DataTrigger> 
            </Style.Triggers> 
           </Style> 
          </TextBlock.Style> 
         </TextBlock> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
     </GridView> 
    </ListView.View> 
</ListView> 

Это тоже не сработало. Мне нужно что-то изменить в контексте данных? Я чувствую, что должен быть способ сделать это. Любые идеи приветствуются.

ответ

4

Как только вы находитесь в DataTemplate, DataContext переключается на связанный предмет. Не обойти это.

Однако, есть другие привязки, которые вы можете сделать. Например, если вам нужно что-то от главного контекста данных, вы можете сделать:

"{Binding ElementName=Root, Path=DataContext.MyProperty}" 

Примечание Ваше окно или корневой элемент должен x:Name="Root" для того, чтобы работать. Вы также можете получить доступ к ресурсам через привязки StaticResource.

+0

Perfect. Спасибо, BradleyDotNET. –

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