如何在继承控件中绑定到自身?

How to Bind to self in inherited controls?

以下触发转换器:

<TextBox Header="Quantity"
         Text="{Binding Quantity, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
         extensions:TextBoxRegex.Regex="^[0-9]" extensions:TextBoxRegex.ValidationMode="Forced"
         Background="{Binding (extensions:TextBoxRegex.IsValid), RelativeSource={RelativeSource Self}, Converter={StaticResource ValidationConverter}}" />

虽然没有:

<TextBox
    x:Class="MyApp.Controls.NumericTextBox"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:extensions="using:Microsoft.Toolkit.Uwp.UI.Extensions"
    xmlns:converters="using:MyApp.Converters"
    extensions:TextBoxRegex.Regex="^[0-9]" extensions:TextBoxRegex.ValidationMode="Forced"
    Background="{Binding (extensions:TextBoxRegex.IsValid), RelativeSource={RelativeSource Self}, Converter={StaticResource ValidationConverter}}">
    <TextBox.Resources>
        <converters:ValidationConverter x:Key="ValidationConverter"/>
    </TextBox.Resources>
</TextBox>

使用时间:

<NumericTextBox Header="Quantity" Text="{Binding Quantity, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

那么如何在继承的 UWP 控件中绑定到自身?

更新:这里是 repro

请将 UpdateSourceTrigger 属性 添加到父级 class,如下所示。

<TextBox 
 extensions:TextBoxRegex.ValidationType="Email"
 Background="{Binding Path=(extensions:TextBoxRegex.IsValid),
 RelativeSource={RelativeSource Mode=Self}, 
 Converter={StaticResource StringFormatConverter},
 UpdateSourceTrigger=PropertyChanged}" />

我已经测试过了,请试试这个,然后告诉我结果。


更新

我已经检查了你的代码。我找到了问题的关键。

  1. 错误的 x:class 路径 (InheritingTextBoxRepro.Control.NumericTextBox->InheritingTextBoxRepro.NumericTextBox)
  2. 您没有调用用于初始化 xaml 的 InitializeComponent

原码

<TextBox
    x:Class="InheritingTextBoxRepro.Control.NumericTextBox"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:extensions="using:Microsoft.Toolkit.Uwp.UI.Extensions"
    xmlns:converters="using:InheritingTextBoxRepro.Converters"
    extensions:TextBoxRegex.Regex="^[0-9]" extensions:TextBoxRegex.ValidationMode="Forced"
    Background="{Binding (extensions:TextBoxRegex.IsValid), 
        RelativeSource={RelativeSource Self}, 
        Converter={StaticResource ValidationConverter},
        UpdateSourceTrigger=PropertyChanged}">
    <TextBox.Resources>
        <converters:ValidationConverter x:Key="ValidationConverter"/>
    </TextBox.Resources>
</TextBox>

public sealed partial class NumericTextBox 
{

}

已修改

<TextBox
    x:Class="InheritingTextBoxRepro.NumericTextBox"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:extensions="using:Microsoft.Toolkit.Uwp.UI.Extensions"
    xmlns:converters="using:InheritingTextBoxRepro.Converters"
    extensions:TextBoxRegex.Regex="^[0-9]" extensions:TextBoxRegex.ValidationMode="Forced"
    Background="{Binding (extensions:TextBoxRegex.IsValid), 
        RelativeSource={RelativeSource Self}, 
        Converter={StaticResource ValidationConverter},
        UpdateSourceTrigger=PropertyChanged}">
    <TextBox.Resources>
        <converters:ValidationConverter x:Key="ValidationConverter"/>
    </TextBox.Resources>
</TextBox>

public sealed partial class NumericTextBox 
{
    public NumericTextBox()
    {
        InitializeComponent();

    }
}

用法

<local:NumericTextBox  Header="Quantity2" Text="{Binding Quantity2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>