DataTemplate 中 Datatrigger 的绑定问题 - WPF
Binding issue over the Datatrigger in DataTemplate - WPF
Objective
我的 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
内的绑定给了我 Empty
<TextBlock Text="{Binding Itemsource}"/>
我希望上面的行在相应的行中显示 test
但它显示 Empty
行。
无法弄清楚为什么 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>
Objective
我的 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
内的绑定给了我 Empty
<TextBlock Text="{Binding Itemsource}"/>
我希望上面的行在相应的行中显示 test
但它显示 Empty
行。
无法弄清楚为什么 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>