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