将WPF ItemsControl项与Trigger中的另一个控件的DataContext进行比较

时间:2014-05-13 14:43:44

标签: c# wpf datatrigger

在我的C#/ WPF / .NET 4.5应用程序中,我想实现一个Trigger,它可以切换一个控件的可见性,该控件位于ItemConmplate的ItemsControl中。

我有另一个名为TheWorkspace的控件。 Workspace的DataContext设置为填充我的ItemsControl的项目之一。对于包含TheWorkspace的DataContext的项目,我想显示指示我们正在处理的项目的文本。

我需要一个触发器,将项目的DataContext与TheWorkspace的DataContext进行比较,并相应地设置项目的可见性。

ItemTemplate:

<DataTemplate>
  <Grid>
    <!-- ... -->
    <TextBlock Grid.Column="2"
               Text="This is the item we're working on."
               Visibility="Hidden">
      <TextBlock.Triggers>
        <!-- Pseudocode -->
        <DataTrigger Binding="{Binding TheWorkspace.DataContext}" Value="{Binding}">
        <!-- /Pseudocode -->
          <Setter Property="Visibility" Value="Visible" />
        </DataTrigger>
      </TextBlock.Triggers>
    </TextBlock>
  </Grid>
</DataTemplate>

遗憾的是,这不符合预期。

如何替换伪代码以指定实现此行为的触发器?

1 个答案:

答案 0 :(得分:0)

我使用 MultiBinding MultiValueConverter 解决了这个问题:

ItemTemplate

<DataTemplate>
  <!-- ... -->
    <TextBlock Text="This is the item we're working on.">
      <TextBlock.Style>
        <Style TargetType="TextBlock">
          <Setter Property="Visibility"
                  Value="Hidden"/>
          <Style.Triggers>
            <DataTrigger Value="True">
              <DataTrigger.Binding>
                <MultiBinding Converter="{StaticResource samenessConverter}">
                  <Binding ElementName="TheWorkspace"
                           Path="DataContext"/>
                  <Binding/>
                </MultiBinding>
              </DataTrigger.Binding>
              <Setter Property="Visibility"
                      Value="Visible"/>
            </DataTrigger>
          </Style.Triggers>
        </Style>
      </TextBlock.Style>
    </TextBlock>
  <!-- ... -->
</DataTemplate>

MultiValueConverter

public class SamenessConverter : IMultiValueConverter {
  public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) {
    return values.All(x => x == values[0]);
  }
  // ...
}