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

时间:2019-02-15 10:00:53

标签: uwp uwp-xaml

以下触发转换器:

<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

1 个答案:

答案 0 :(得分:0)

请像下面这样将$sz !~ /[^[:xdigit:]]/ # Doesn't contain non-hex digits 属性添加到父类。

UpdateSourceTrigger

我已经测试了它的工作原理,请尝试一下并让我知道结果。


更新

我已经检查了您的代码。我发现了问题的症结所在。

  1. 错误的x:class路径(<TextBox extensions:TextBoxRegex.ValidationType="Email" Background="{Binding Path=(extensions:TextBoxRegex.IsValid), RelativeSource={RelativeSource Mode=Self}, Converter={StaticResource StringFormatConverter}, UpdateSourceTrigger=PropertyChanged}" />
  2. 您尚未调用用于初始化xaml的InheritingTextBoxRepro.Control.NumericTextBox->InheritingTextBoxRepro.NumericTextBox

原始代码

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();

    }
}