数据模板 - WPF 中的数据触发器上的绑定问题

本文关键字:数据 触发器 绑定 问题 WPF | 更新日期: 2023-09-27 18:36:01

Objective我的目标是根据视图模型中的属性GridView行中加载控件。

示例代码:这是我尝试过的示例 xaml。

<ListView Margin="10" Name="lvUsers">
    <ListView.View>
        <GridView x:Name="gridview">
            <GridViewColumn Header="Type">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <ContentControl>
                            <ContentControl.Style>
                                <Style TargetType="{x:Type ContentControl}">
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding IsImage}" Value="True">
                                            <Setter Property="ContentTemplate">
                                                <Setter.Value>                                                        
                                                    <DataTemplate>
                                                        <TextBlock Text="Text goes here"
                                                    Foreground="Red"/>
                                                    </DataTemplate>
                                                </Setter.Value>
                                            </Setter>
                                        </DataTrigger>
                                        <DataTrigger Binding="{Binding IsImage}" Value="False">
                                            <Setter Property="ContentTemplate">
                                                <Setter.Value>
                                                    <DataTemplate>
                                                        <TextBlock Text="{Binding Itemsource}"/>
                                                    </DataTemplate>
                                                </Setter.Value>
                                            </Setter>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </ContentControl.Style>
                        </ContentControl>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

和我的示例 xaml.cs 代码

public partial class MainWindow : Window
{    
    public MainWindow()
    {
        InitializeComponent();            
        List<myClass> mc = new List<myClass>();
        mc.Add(new myClass() { Itemsource = "test", IsImage = false });
        mc.Add(new myClass() { Itemsource = "test", IsImage = true });
        lvUsers.ItemsSource = mc;
    }     
}
class myClass
{
    public string Itemsource { get; set; }
    public bool IsImage { get; set; }
}

问题:DataTriggers按预期工作,但Triggers内的绑定给我空

<TextBlock Text="{Binding Itemsource}"/>

我希望上面的行在相应的行中显示test,但它显示Empty行。

数据模板 - WPF 中的数据触发器上的绑定问题

无法弄清楚为什么 TextBlock 的 DataContext 为空。这可能是由于自定义内容模板。但是,无论如何,您可以通过像这样搜索ContentControl祖先类型来解决此问题。

<DataTrigger Binding="{Binding IsImage}" Value="False">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <TextBlock Text="{Binding DataContext.Itemsource, RelativeSource={RelativeSource FindAncestor, AncestorType=ContentControl}}"/>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</DataTrigger>

这将从父控件数据绑定中提取数据。

编辑

正是因为 ContentControl,你需要像 - <ContentControl Content="{Binding}"> 一样做内容绑定。然后,数据上下文将按原样可用,并且<TextBlock Text="{Binding Itemsource}"/>将正常工作。

<ContentControl Content="{Binding}">
    <ContentControl.Style>
        <Style TargetType="{x:Type ContentControl}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsImage}" Value="True">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>                                                        
                            <DataTemplate>
                                <TextBlock Text="Text goes here"
                            Foreground="Red"/>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding IsImage}" Value="False">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <TextBlock Text="{Binding Itemsource}"/>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>