C# 将属性绑定到表达式

C# 将属性绑定到表达式,c#,wpf,xaml,C#,Wpf,Xaml,在WPF中,我有一个文本框 将其文本绑定到SomeText 公共字符串SomeText{get;set;} 公共布尔启用提交=>!IsNullOrWhiteSpace(SomeText); 我还编写了另一个属性:enablesmit 因此,我创建了一个带有按钮的绑定: 我希望只有当文本框中的文本不为空时,按钮才能启用 但在我启动应用程序后: 无论我做什么,按钮总是被禁用 那么我的逻辑有什么问题?启用带有表达式的按钮的正确方法是什么?要更新数据绑定,绑定的数据源需要支持更改通知。有两种

在WPF中,我有一个
文本框


将其文本绑定到
SomeText

公共字符串SomeText{get;set;}
公共布尔启用提交=>!IsNullOrWhiteSpace(SomeText);
我还编写了另一个属性:
enablesmit

因此,我创建了一个带有按钮的绑定:


我希望只有当文本框中的文本不为空时,按钮才能启用

但在我启动应用程序后:

无论我做什么,按钮总是被禁用


那么我的逻辑有什么问题?启用带有表达式的按钮的正确方法是什么?

要更新数据绑定,绑定的数据源需要支持更改通知。有两种方法可以做到这一点:

  • DependencyObject
    与一起使用,或
  • 实现接口
  • 以上两种方法都提供了一种在属性更新时告知绑定的方法;普通属性(如代码中显示的属性)不会。这就是绑定从不更新的原因:它从未被告知需要更新


    仅上述内容就可以解决您的问题,但我觉得我也应该向您介绍WPF。您正在执行的操作(根据是否可以执行关联的操作启用或禁用按钮)是一项烘焙到命令中的功能

    命令可以让您获取是否可以执行某个操作以及该操作是什么的逻辑,并将其与UI分离。与绑定
    IsEnabled
    和处理
    单击事件(如果可行)相比,它们通常更受欢迎。而是将
    Button.Command
    绑定到所需的命令对象。
    按钮将根据命令是否可以执行自动启用或禁用自身,并在单击时运行该命令。

    您没有绑定到表达式,而是绑定到计算属性。此属性不会自动重新评估。在您的情况下,在加载按钮时会检索一次,而不再检索。您必须启动并引发
    PropertyChanged
    事件,才能在用户界面中触发属性当前值的更新。作为旁注,它与
    SomeText
    属性相同,如果您试图在代码中更改它,它将不会更新文本框

    下面是该接口的示例实现。请注意,您必须在
    SomeText
    属性的setter中触发
    EnableSubmit
    属性的属性更改,因为它依赖于它

    public class YourViewModel : INotifyPropertyChanged
    {
       // ...your other code.
    
       private string _someText;
       public string SomeText
       {
          get => _someText;
          set
          {
             if (_someText == value)
                return;
       
             _someText = value;
    
             // This will trigger an update wherever SomeText is bound in the UI, if you need it
             OnPropertyChanged();
    
             // This will trigger the IsEnabled binding update
             OnPropertyChanged(nameof(EnableSubmit));
          }
       }
    
       public event PropertyChangedEventHandler PropertyChanged;
       
       protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
       {
          PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
       }
    }
    
    在仅当文本不为空时才启用按钮的特定情况下,还可以使用样式

    <Button Content="Submit">
       <Button.Style>
          <Style TargetType="{x:Type Button}">
             <Setter Property="IsEnabled" Value="True"/>
             <Style.Triggers>
                <DataTrigger Binding="{Binding Text.Length, ElementName=MyText}" Value="0">
                   <Setter Property="IsEnabled" Value="False"/>
                </DataTrigger>
             </Style.Triggers>
          </Style>
       </Button.Style>
    </Button>
    
    在XAML代码中,您将删除
    IsEnabled
    绑定,并添加命令

    <Button Content="Submit" Command="{Binding DoSomething}"/>
    
    
    
    也就是说,不需要公开
    EnableSubmit
    属性。如果除了操作之外,您并不真正需要视图模型中文本框中的文本,您甚至可以删除
    SomeText
    属性,并在XAML中直接将文本作为
    CommandParameter
    传递(传递给execute并可以执行方法)。

    。简介说:为了支持单向或双向绑定,使绑定目标属性能够自动反映绑定源的动态更改(例如,当用户编辑表单时,预览窗格会自动更新),类需要提供适当的属性更改通知。此示例演示如何创建实现INotifyPropertyChanged的类。
    <Button Content="Submit" Command="{Binding DoSomething}"/>