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)
由于该文本框是只读的,因此绑定模式不能是双向的。
为什么不?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。
| 归档时间: |
|
| 查看次数: |
9405 次 |
| 最近记录: |