0

我试图在我的中设置一个触发器,DataTemplate以便当源对象的属性HasUnreadMessages设置为 true 时,标题文本变为红色。但是从数据模板中的触发器内部,我不知道如何引用TextBlock标头的。

完整代码:

<Window x:Class="IRC.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:loc="clr-namespace:IRC"
        Title="" Height="350" Width="525">

    <Window.Resources>
        <DataTemplate DataType="{x:Type loc:Tab}">
            <DockPanel>
                <ListBox x:Name="lstUsers" ItemsSource="{Binding Users}" Visibility="Collapsed" DockPanel.Dock="Right" />
                <ListBox x:Name="lstMessage" ItemsSource="{Binding Messages}" />
            </DockPanel>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding Type}" Value="Channel">
                    <Setter TargetName="lstUsers" Property="Visibility" Value="Visible" />
                </DataTrigger>
                <DataTrigger Binding="{Binding HasUnreadMessages}" Value="True">
                    <Setter TargetName="tabHeader" Property="Foreground" Value="Red" /> // -- ERROR
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </Window.Resources>

    <DockPanel>
        <Menu DockPanel.Dock="Top">
            <MenuItem Header="_Actions">
                <MenuItem Header="_Connect" InputGestureText="Alt+C" Click="Connect" />
            </MenuItem>
        </Menu>
        <TextBox Name="txtInput" Height="22" VerticalContentAlignment="Center" SpellCheck.IsEnabled="True" DockPanel.Dock="Bottom" />
        <TabControl Name="pnlTabs" ItemsSource="{Binding}" ContentTemplate="{Binding}" DockPanel.Dock="Top">
            <TabControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock x:Name="tabHeader" Text="{Binding Name}"/>
                </DataTemplate>
            </TabControl.ItemTemplate>
        </TabControl>
    </DockPanel>
</Window>

错误 :

The name "tabHeader" is not recognized. 
The member "Foreground" is not recognized or is not accessible. 

标签 :

public class Tab
{
    public string Name { get; set; }
    public string Type { get; set; }
    public ObservableCollection<string> Users { get; set; }
    public ObservableCollection<string> Messages { get; set; }
    public bool HasUnreadMessages { get; set; }
}
4

1 回答 1

0

You're trying to change a property of an object which is not known at that point.

Instead of putting the DataTrigger on the Tab, move the DataTrigger to the TabItem - since it's the TabItem that you're trying to change...

In your case, add a TabItem style:

<Window.Resources>
 <DataTemplate DataType="{x:Type TabItem}" x:Key="ItemTemplateStyle">
            <TextBlock x:Name="tabHeader" Text="{Binding Name}"/>
        <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding HasUnreadMessages}" Value="True">
            <Setter TargetName="tabHeader" Property="Foreground" Value="Red" />
        </DataTrigger>
        </DataTemplate.Triggers>
 </DataTemplate>

And set this style for the TabItems:

<TabControl Name="pnlTabs" ItemsSource="{Binding}" ContentTemplate="{Binding}" DockPanel.Dock="Top" 
            ItemTemplate="{StaticResource ItemTemplateStyle}" />
于 2013-01-05T23:10:49.250 回答