为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 XAML 样式模板绑定到另一个对象属性?

如何使用 XAML 样式模板绑定到另一个对象属性?

C#
繁星淼淼 2022-11-21 20:24:04
假设我有以下课程:public class MyClass : System.Windows.FrameworkElement{    public static readonly DependencyProperty HasFocusProperty = DependencyProperty.RegisterAttached("HasFocus", typeof(bool), typeof(MyClass), new PropertyMetadata(default(bool)));    public bool HasFocus    {        get => (bool)GetValue(HasFocusProperty);        set => SetValue(HasFocusProperty, value);    }    public System.Windows.Controls.TextBox TextBox { get; set; }}我想根据 property 更改TextBoxvia XAML Template Trigger 的一些 UI 属性HasFocus,所以我执行以下操作:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    xmlns:win="clr-namespace:System.Windows.Controls">    <Style TargetType="{x:Type win:TextBox}">        <Setter Property="Template">            <Setter.Value>                <ControlTemplate TargetType="{x:Type win:TextBox}">                    <ControlTemplate.Triggers>                        <Trigger Property="MyClass.HasFocus" Value="True">                            <Setter TargetName="Border" Property="BorderBrush" Value="Red" />                            <Setter TargetName="Border" Property="BorderThickness" Value="2" />                        </Trigger>                    </ControlTemplate.Triggers>                </ControlTemplate>            </Setter.Value>        </Setter>    </Style> </ResourceDictionary>但是,设置时不应用样式HasFocus = true。在 的属性中TextBox,我可以看到触发器已注册。如果我更改<Trigger Property="MyClass.HasFocus" Value="True">为<Trigger Property="MyClass.HasFocus" Value="False">,则最初会应用我的样式。所以我认为我的 XAML 定义没问题。任何想法如何解决这个问题?
查看完整描述

1 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

应用于 a 的模板中的元素TextBox不能绑定到 a 的属性MyClass,除非有一个MyClass元素可以绑定到可视化树中的某处。


如果您希望能够设置 a 的自定义HasFocus属性TextBox,您应该创建一个附加属性:


public class FocusExtensions

{

    public static readonly DependencyProperty SetHasFocusProperty = DependencyProperty.RegisterAttached(

        "HasFocus",

        typeof(bool),

        typeof(FocusExtensions),

        new FrameworkPropertyMetadata(false)

    );


    public static void SetHasFocus(TextBox element, bool value)

    {

        element.SetValue(SetHasFocusProperty, value);

    }


    public static bool GetHasFocus(TextBox element)

    {

        return (bool)element.GetValue(SetHasFocusProperty);

    }

}

它可以为任何TextBox元素设置:


<TextBox local:FocusExtensions.HasFocus="True">

    <TextBox.Style>

        <Style TargetType="{x:Type TextBox}">

            <Style.Triggers>

                <Trigger Property="local:FocusExtensions.HasFocus" Value="True">

                    <Setter Property="BorderBrush" Value="Red" />

                    <Setter Property="BorderThickness" Value="2" />

                </Trigger>

            </Style.Triggers>

        </Style>

    </TextBox.Style>

</TextBox>


查看完整回答
反对 回复 2022-11-21
  • 1 回答
  • 0 关注
  • 143 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号