【问题标题】:Trigger on parent property changed, but Set property for a child of a specific type父属性上的触发器已更改,但为特定类型的子属性设置属性
【发布时间】:2023-03-29 07:27:01
【问题描述】:

我不知道这是否可能,我对 wpf 了解不多。

我有这个带有 2 个 TabItems 的 TabControl,每个 TabItems 都包含一个 TextBox

<TabControl>
        <TabItem Style="{StaticResource TabStyle}" Header="TabItem1">
            <TextBox/>
        </TabItem>
        <TabItem Style="{StaticResource TabStyle}" Header="TabItem2">
            <TextBox/>
        </TabItem>
 </TabControl>

我对 TabItem 有这种风格

<Style x:Key="TabStyle" TargetType="{x:Type TabItem}">
            <Style.Triggers>
                <Trigger Property="IsFocused" Value="true">
                    <Setter Property="Text" Value="tab is focused"/> <!--Point this setter to the textbox inside the tab item -->
                </Trigger>
                <Trigger Property="IsFocused" Value="false">
                   <Setter Property="Text" Value="tab is focused"/><!--Point this setter to the textbox inside the tab item -->
                </Trigger>
            </Style.Triggers>
   </Style>

如果我的选项卡项只有一个 TextBox 类型的控件,是否可以从选项卡项触发器内部的设置器中修改该文本框,如何在不使用名称的情况下找到 TextBox 类型的子项?

【问题讨论】:

    标签: c# wpf xaml triggers


    【解决方案1】:

    我建议将 TabItem 的 IsFocused 属性绑定到 ViewModel 中的 bool 属性。我还将 TextBox Text 属性绑定到 ViewModel 中的字符串。

    <TabControl>
        <TabItem IsFocused="{Binding IsFocused}" Header="TabItem1">
            <TextBox Text="{Binding IsFocusedText}" />
        </TabItem>
    </TabControl>
    

    然后,您可以创建一个方法来在 TabItem IsFocused 时更改 TextBox 值,如下所示:

    public bool _isFocused;
    public bool IsFocused
    {
       get { return _isFocused; }
       set
       {
          if (value == _isFocused)
             return;
          _isFocused = value;
          OnIsFocusedChanged(value);
          RaisePropertyChanged(() => IsFocused);
    }
    
    private void OnIsFocusedChanged(bool isFocused)
    {
       if (isFocused)
          IsFocusedText = "tab is focused";
       else
          IsFocusedText = "tab is NOT focused";
    }
    
    public bool _isFocusedText;
    public bool IsFocusedText
    {
       get { return _isFocusedText; }
       set
       {
          if (value == _isFocusedText)
             return;
          _isFocusedText = value;
          RaisePropertyChanged(() => IsFocusedText);
    }
    

    编辑:

    另一种选择:

    <TabControl>
        <TabItem Name="TabItem1" Header="TabItem1">
            <TextBox Text="tab is NOT focused" >
               <TextBox.Style>
                  <Style TargetType="{x:Type TextBox}">
                     <Style.Triggers>
                        <DataTrigger Binding="{Binding IsFocused, ElementName=TabItem1}" Value=True>
                           <Setter Property="Text" Value="tab is focused" />
                        </DataTrigger>
                     </Style.Triggers>
                  </Style>
               </TextBox.Style>
             </TextBox>
        </TabItem>
    </TabControl>
    

    【讨论】:

    • Lee 这正是我所做的,所以仅使用 XAML 是不可能的?
    • 嗯...您可以将触发器放在 TextBox 上的样式中。然后将触发器属性绑定到 TabItem。我将用一个例子进行编辑。
    • 我将不胜感激!
    • 如果你想让它在其他选项卡上可重用,请使用 AncestorType 而不是 ElementName 来“查找”TabItem。
    猜你喜欢
    • 2010-11-04
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 2013-08-30
    • 2012-11-23
    相关资源
    最近更新 更多