WPF TextBox:如何将绑定模式默认更改为OneWay?

new*_*man 7 wpf binding textbox binding-mode

最初,我有以下代码:

<TextBox Text="{Binding LengthUnit, Mode=OneWay}" IsReadOnly="True" Background="{x:Static SystemColors.ControlBrush}" />
Run Code Online (Sandbox Code Playgroud)

我知道我可以定义这样的样式:

<Style TargetType="{x:Type TextBox}" x:Key="readOnlyTextBox">
    <Setter Property="Background" Value="{x:Static SystemColors.ControlBrush}"></Setter>
    <Setter Property="IsReadOnly" Value="True"></Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

这样我就可以写:

<TextBox Text="{Binding LengthUnit, Mode=OneWay}" Style="{StaticResource readOnlyTextBox}" />
Run Code Online (Sandbox Code Playgroud)

因为此文本框是只读的,所以绑定模式不能是双向的.那么,是否可以使用此样式将OneWay绑定作为我的TextBox的默认值?

编辑:我需要将绑定模式更改为OneWay,因为我的属性是get-only,而不是因为我标记了TextBox只读.但是,如果可能的话,我仍然希望将文本框的默认绑定模式更改为OneWay.


这是我遵循你的建议的代码,但它不起作用.我错过了什么吗?

public class ReadOnlyTextBox : TextBox
{
    static ReadOnlyTextBox()
    {
        TextBox.TextProperty.OverrideMetadata(typeof(ReadOnlyTextBox), 
            new FrameworkPropertyMetadata() { BindsTwoWayByDefault = false, Journal = true, DefaultUpdateSourceTrigger = UpdateSourceTrigger.Explicit }); 
    }
    public ReadOnlyTextBox()
    {
        base.Background = SystemColors.ControlBrush;
        base.IsReadOnly = true;            
    }
}
Run Code Online (Sandbox Code Playgroud)

fos*_*son 4

由于该文本框是只读的,因此绑定模式不能是双向的。

为什么不?IsReadOnly 将阻止用户修改文本并从而修改属性。只需确保不要修改代码中的 Text 属性即可。

如果您对 TextBox 进行子类化,则可以阻止更新绑定属性。如果这样做,您可以覆盖 TextBox.Text 依赖属性元数据。

public class TextBoxEx : TextBox
{
    public TextBoxEx() : base() { }

    static TextBoxEx()
    {
        TextBox.TextProperty.OverrideMetadata(typeof(TextBoxEx), 
            new FrameworkPropertyMetadata() { BindsTwoWayByDefault = false, Journal = true,
                DefaultUpdateSourceTrigger = System.Windows.Data.UpdateSourceTrigger.Explicit });
    }

}
Run Code Online (Sandbox Code Playgroud)

由于某些原因,将 BindsTwoWayByDefault 更改为 false 对我来说不起作用,但您可以将 DefaultUpdateSourceTrigger 设置为 Explicit,这意味着除非通过代码完成,否则不会更新绑定属性,从而有效地进行绑定 OneWay。