WPF 在代码隐藏中设置 TextBox 属性

Posted

技术标签:

【中文标题】WPF 在代码隐藏中设置 TextBox 属性【英文标题】:WPF Set a TextBox property in code-behind 【发布时间】:2021-12-18 16:04:06 【问题描述】:

您好,我想通过后面的代码设置文本框的 Text 属性。目前我使用 XAML:

<TextBox x:Name="txtFilter" Text="Binding FiltroFunzioni, Mode=OneWayToSource" Grid.Row="0" />

作为测试,我这样做了:

Binding b = new Binding();
b.Mode = BindingMode.OneWayToSource;
b.Path = new PropertyPath("Text");  //??
b.Source = PageViewModel.FiltroFunzioni;
BindingOperations.SetBinding(txtFilter, TextBlock.TextProperty, b);

变量“FiltroFunzioni”是一个定义为属性的字符串:

private string _filtroFunzioni = "";
public string FiltroFunzioni

    get  return _filtroFunzioni; 
    set
    
        _filtroFunzioni = value;
        RaisePropertyChanged("FiltroFunzioni");
        _functionsView.Refresh();
    

    

基本上我不知道我应该将什么样的值设置为 PropertyPath。有什么想法吗?

【问题讨论】:

【参考方案1】:

这里不需要 PropertyPath。如果您只是删除它,您的绑定应该可以工作。

话虽如此,您应该尽可能在 XAML 中绑定。

如果您的问题是对 FiltroFunzioni 的更改不会更新您的文本框,那是因为您的绑定被明确声明为 OneWayToSource:这意味着更改 UI 会更改源,但更改源不会更改 UI .如果这不是您想要的,请将 Mode 设置为其他内容,例如“TwoWay” - 然后更改源会更改 UI,更改 UI 会更改源。

编辑:

如果您真的想从 ViewModel 进行绑定,而不仅仅是使用 XAML,则在通过 C# 绑定时,出于某种原因,TwoWay 绑定需要使用 Path。以下任一解决方案都有效:

b.Source = FiltroFunzioni;
b.Path = new PropertyPath(".");

b.Source = this;
b.Path = new PropertyPath("FiltroFunzioni");

请注意,使用双向绑定时,您必须通过在 XAML 中设置 TextBox.Text 属性来初始化 FiltroFunzioni,或者在初始化绑定后设置 FiltroFunzioni。否则,WPF 将立即从 TextBox 中的(默认为空)Text 覆盖它。

【讨论】:

感谢您的提示,但如果我省略属性路径,我会遇到“双向绑定需要路径或 XPath”问题 编辑了我的答案

以上是关于WPF 在代码隐藏中设置 TextBox 属性的主要内容,如果未能解决你的问题,请参考以下文章

在代码隐藏中设置WPF对象的动态大小

如果在 Element 中设置,WPF 触发器将不会设置属性

c#设置TextBox的FontSize

尝试在 WPF 中设置组合框的背景

WPF:一旦我在代码中设置了一个属性,它就会永远忽略 XAML 绑定......我该如何防止这种情况发生?

wpf怎么给textbox的text属性指定默认值