如何在继承控件中绑定到自身?
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}" />
我已经测试过了,请试试这个,然后告诉我结果。
更新
我已经检查了你的代码。我找到了问题的关键。
- 错误的 x:class 路径 (
InheritingTextBoxRepro.Control.NumericTextBox->InheritingTextBoxRepro.NumericTextBox
)
- 您没有调用用于初始化 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}"/>
以下触发转换器:
<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}" />
我已经测试过了,请试试这个,然后告诉我结果。
更新
我已经检查了你的代码。我找到了问题的关键。
- 错误的 x:class 路径 (
InheritingTextBoxRepro.Control.NumericTextBox->InheritingTextBoxRepro.NumericTextBox
) - 您没有调用用于初始化 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}"/>