0

我有一个列表视图显示这个(或多或少):

--------------------------------------------------------
| Rule no. | Rule Type | Rule Name | Priority | Active |
--------------------------------------------------------
|   1      |     1     |  My Rule  |    1     |   1    |
--------------------------------------------------------

使用此 XAML:

<ListView.View>
    <GridView>
        <GridViewColumn Header="Rule No" DisplayMemberBinding="{Binding Path=RuleNo}" Width="150" />
        <GridViewColumn Header="Rule Type" DisplayMemberBinding="{Binding Path=RuleTypeNo}" Width="75">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <DataTemplate.Triggers>
                        <DataTrigger Binding="{Binding Path=RuleTypeNo}" Value="1">   
                        </DataTrigger>
                    </DataTemplate.Triggers>        
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Rule Name" DisplayMemberBinding="{Binding Path=RuleName}" Width="430"/>
        <GridViewColumn Header="Priority" DisplayMemberBinding="{Binding Path=RulePriority}" Width="50"/>
        <GridViewColumn Header="Active" Width="50">
            <GridViewColumn.CellTemplate>
                <HierarchicalDataTemplate>
                    <CheckBox Visibility="Visible" Name="chkActive" IsChecked="{Binding RuleActive}">
                        <TextBlock Text=" "/>
                    </CheckBox>
                </HierarchicalDataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
    </GridView>
</ListView.View>

我要做的就是为 RuleTypeNo 列更改数据值

1

成词

应用程序

和价值

2

成词

拨号

在运行时在列表视图单元格中可视化。例如。如果列包含 1,则显示一个单词,如果列包含 2,则显示另一个单词。

这似乎几乎是不可能的,我现在已经花了大约 9 个小时。如您所见,我尝试使用数据触发器来执行此操作,但它显然永远不会触发。我尝试了各种设置器,但要么无法使设置器成为有效标记,要么在列表视图显示时没有任何反应——例如,触发器显然被忽略了。

我究竟做错了什么?我进行了广泛的搜索,但似乎没有人想通过触发器解释单元格中的实际数据以另一种形式显示 - 将数字变成单词 - 每个人都想更改颜色、字体等 - 我不想更改样式,我想更改规则类型编号的单元格中的显示值...

如何在 XAML 列表视图中将单元格中的视觉显示值更改为同一单元格中的另一个显示值?我只想在视觉上将“1”解释为“App”,将“2”解释为“Dial”。

4

1 回答 1

0

您可以尝试创建一个ValueConverter来更改值。

在 XAML 的资源部分中包含转换器:

<src:MyConverter x:Key="myConverter"/>

然后调整你的绑定:

<GridViewColumn DisplayMemberBinding="{Binding Path=RuleNo,
                                      Converter={StaticResource myConverter}}}"/>

转换器看起来像:

[ValueConversion(typeof(int), typeof(String))]
public class MyConverter : IValueConverter
{
    public object Convert(object value,
                          Type targetType,
                          object parameter,
                          CultureInfo culture)
    {
        int number = (int)value;
        if (number == 1)
            return "App";
        if (number == 2)
            return "Dial";
        ...
    }

    public object ConvertBack(object value,
                              Type targetType,
                              object parameter,
                              CultureInfo culture)
    {
        ....
    }
}

也就是说,我个人的偏好是在你要绑定的东西上公开一个名为例如 RuleTypeDescription 的新属性;而不是绑定到数字。

编辑

如果您想使用触发器来执行此操作,可以执行以下操作:

<GridViewColumn Header="Thingy">
    <GridViewColumn.CellTemplate>
        <DataTemplate DataType="{x:Type WpfTests:Item}">
            <TextBlock>
                <TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding MyNumber}" Value="1">
                                <Setter Property="Text" Value="One"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding MyNumber}" Value="2">
                                <Setter Property="Text" Value="Two"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
            </TextBlock>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

请注意,我们没有设置 DisplayMemberBinding 或绑定到 TextBlock 元素中的 Text 属性。

于 2013-06-20T08:58:03.433 回答