【问题标题】:Compare WPF ItemsControl item to another control's DataContext in Trigger将 WPF ItemsControl 项与 Trigger 中另一个控件的 DataContext 进行比较
【发布时间】:2014-05-13 14:43:44
【问题描述】:

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

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

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

项目模板:

<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>

很遗憾,这并没有按预期工作。

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

【问题讨论】:

  • 看来你把它复杂化了。使用ListBox 并简单地触发IsSelected
  • 或者保留 ItemsControl 并向视图模型添加另一个属性,例如“IsCurrent”。

标签: c# wpf datatrigger


【解决方案1】:

我已经使用 MultiBindingMultiValueConverter 解决了这个问题:

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>

多值转换器

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-22
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多