wpf 切换ItemTemplate文本

ig9co6j1  于 2023-06-24  发布在  其他
关注(0)|答案(1)|浏览(90)

我需要显示一个来自Web服务调用的描述列表。我选择在ItemControl上显示它们。
为了简化,我们假设数据的形式如下:

public class Voce
{
    public string Ita { get; set; }
    public string Eng { get; set; }
}

控件的XAML代码为:

<ItemsControl x:Name="table" Margin="20,70,20,92" Background="#FFFFF3F3">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
            <TextBlock Name="myDesc" Text="{Binding Ita}"></TextBlock>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

当然我设置:

private List<Voce> listaVoci;
...
table.ItemsSource = listaVoci;

此操作正常,并设置为Ita字段。
现在我需要切换文本并在同一个List<>中显示Eng字段(点击按钮),但我不知道如何操作。我试着这样做:

Binding binding = new Binding("Text")
    {
        Source = listaVoci,
        Path = new PropertyPath("Eng")
    };
    SetBinding( TextBlock.TextProperty, binding);

但是,当然,没有对内部TextBlock的引用。
或者将描述分成两个列表并切换表是否更好/更简单?ItemSource?

9ceoxa92

9ceoxa921#

您可以将DataTrigger添加到模板中,并绑定到某个决定显示哪个值的属性。
在下面的例子中,我使用ItemsControlTag属性来实现这一点:

<ItemsControl x:Name="table" Margin="20,70,20,92" Background="#FFFFF3F3">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock>
                <TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Setter Property="Text" Value="{Binding Ita}" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Tag, 
                                            Source={x:Reference table}}" Value="Eng">
                                <Setter Property="Text" Value="{Binding Eng}" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
            </TextBlock>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

然后,只需在按钮单击事件处理程序中设置属性,以显示Voce对象的Eng属性的值:

private void Button_Click(object sender, RoutedEventArgs e)
{
    table.Tag = "Eng";
}

相关问题