【问题标题】:WPF bind GridViewColumn to different PropertiesWPF 将 GridViewColumn 绑定到不同的属性
【发布时间】:2017-09-14 16:46:18
【问题描述】:

我有一个 WPF ControlTemplate,其中包含一个 ListView,它的 ItemsSource 绑定到我的类中的一个集合。

根据用户选择的选项,我有时想将 GridViewColumn 绑定到一个文本值,但有时我想显示另一个:

<GridViewColumn x:Name="DescriptionColumn" Header="{DynamicResource MyHeader}" >
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding MyText1}"/>        
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

解决此问题的最佳方法是什么?根据我显示的数据,我想绑定到 MyText1 或 MyText2。如何进行“切换”?

【问题讨论】:

  • “取决于我显示的数据” - 这个“取决于”是什么样子的?它是另一个属性(就像下面假设的两个答案)还是其他什么?

标签: wpf xaml listview binding


【解决方案1】:

您可以将StyleDataTrigger 一起使用:

<GridViewColumn x:Name="DescriptionColumn" Header="{DynamicResource MyHeader}" >
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock>
                <TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Setter Property="Text" Value="{Binding MyText1}" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding TriggerProperty}" Value="2">
                                <Setter Property="Text" Value="{Binding MyText2}" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
            </TextBlock>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

在上面的示例标记中,当“TriggerProperty”返回“2”时,TextBlockText 属性将绑定到“MyText2”。

【讨论】:

    【解决方案2】:

    做到这一点的方法是使用多重绑定...

                    <GridViewColumn x:Name="DescriptionColumn" Header="{DynamicResource MyHeader}" >
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Style="{StaticResource TextBlockMultiValue}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
    

    其中使用以下资源...

        <local:MultiValueConverter x:Key="MultiValueConverter"/>
        <Style x:Key="TextBlockMultiValue" TargetType="TextBlock">
            <Setter Property="Text">
                <Setter.Value>
                    <MultiBinding Converter="{StaticResource MultiValueConverter}">
                        <Binding Path="MyText1"/>
                        <Binding Path="MyText2"/>
                        <Binding Path="Switch"/>
                    </MultiBinding>
                </Setter.Value>
            </Setter>
        </Style>
    

    而转换器如下...

    public class MultiValueConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if ((bool)values[2] == true)
                return values[0].ToString();
            else
                return values[1].ToString();
        }
    
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    因此转换器根据转换器的第三个输入在一个字符串或另一个字符串之间进行选择。

    【讨论】:

      猜你喜欢
      • 2013-12-19
      • 2016-05-09
      • 1970-01-01
      • 2011-07-06
      • 2021-12-05
      • 2016-09-23
      • 2011-02-08
      • 1970-01-01
      • 2016-05-06
      相关资源
      最近更新 更多