【问题标题】:WPF - TextBox not binding properly when set to readonlyWPF - 设置为只读时文本框无法正确绑定
【发布时间】:2018-12-29 07:01:24
【问题描述】:

我有我用来添加(仅添加而不是读取)文件路径到数据库的文本框。当用户选择某个文件(OpenFileDialog)时设置文本属性。所以,我将它设置为只读状态,它不会正确绑定。当我删除只读时,它工作正常。

<Button Name="btnAddFile" Content="+" HorizontalAlignment="Left" Width="23" Height="23" Click="AddFilePath"/>
<TextBox Name="tbxFilePath" Height="23" Text="{Binding FilePath}" Width="364" IsReadOnly="True"/>

当我使用时:

Text="{Binding FilePath, Mode=OneWayToSource}"

它有时会起作用,但大多数时候不起作用(?!)。我可以使用 TextBlock 或 Label,但我真的很想了解发生了什么并使用 TextBox。

我正在使用实体框架,但我认为这并不重要。

问题:如何以编程方式将文本添加到只读的 TextBox 控件并能够绑定它。

编辑:我想出了问题所在。当我将焦点放在 TextBox after 我从代码隐藏设置它的 Text 属性时,它可以工作。我想当我从代码隐藏中执行此操作时,它必须通知 Text 已更改。该怎么做?

【问题讨论】:

    标签: c# wpf binding textbox


    【解决方案1】:

    您是否尝试过使用OneWay 绑定?

    MSDN 上写道:

    OneWay 在绑定源(source)发生变化时更新绑定目标(target)属性。如果被绑定的控件是隐式只读,则这种类型的绑定是合适的。

    我认为这涵盖了您的情况。

    target 是您的 TextBox Text 属性,而您的 source 是您 ViewModel 上的 FilePath 属性。

    用途:

    Text="{Binding FilePath, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
    

    编辑

    此答案假定您已在 ViewModel 上实现 INotifyPropertyChanged

    编辑

    正确的绑定模式是OneWayToSource。由 OP 确认。

    【讨论】:

    • 有时我仍然对源目标感到困惑。我已经尝试过 OneWay,但它不起作用。正如我所说,如果我在 Text 属性更改后将焦点设置在 TextBox 上,即使没有将 Mode 设置为任何内容,也一切正常。我想我需要通知 Text 属性已更改(当我将焦点设置为控件时会自动发生)但我不知道如何。
    • 这就是UpdateSourceTrigger=PropertyChanged 的用途。
    • 唯一的解决方法是将 tbxFilePath.Focus() 放在代码后面。
    • 实现了 INotifyPropertyChanged 并且效果很好,但是您对 Mode 有误。它应该是 Mode=OneWayToSource 因为我正在更新我的源并且数据流是从目标到源的。感谢您的帮助。
    • @Ivan 你完全正确,应该是OneWayToSource。我很高兴你让它工作。我有时也会对整个源 - 目标方向感到困惑。我将编辑我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    相关资源
    最近更新 更多