我在寻找正确的XAML语法,以设置我的Viewmodel中的属性(例如"BusyEditing"),该属性已经与一个按钮的“IsEnabled”绑定相关联。基本上,我想要在我开始编辑字段时立即启用“保存”按钮。更酷的是,如果在文本框值改变时而不仅仅是GotFocus时更新该属性,那就太好了。谢谢。
在MVVM Light中,它看起来像这样:
public RelayCommand LogonCommand { get; private set; }
LogonCommand = new RelayCommand(
Logon,
CanLogon
);
private Boolean CanLogon(){
return !String.IsNullOrWhiteSpance(SomeProperty);
}
在您的XAML中,只需确保将按钮命令绑定到ViewModel命令:
<Button Command="{Binding LogonCommand}" />
SomeProperty
,那么它可以在不需要任何额外工作和不需要后台代码的情况下正常工作。
此外,如果你想要在属性更改时而不是失去焦点时触发,那么你需要明确定义这一点。如果你想了解更多请访问更新源触发器页面。<TextBox>
<TextBox.Text>
<Binding Source="{StaticResource myDataSource}" Path="SomeProperty"
UpdateSourceTrigger="PropertyChanged"/>
</TextBox.Text>
</TextBox>
最简单的方法是在代码后台完成,尽管这对于WPF开发人员来说有点不妥,但它是视图逻辑,不会破坏单元测试的可能性。
<TextBox GotFocus="GotFocus"/>
<Button Name="SaveButton" Command="{Binding SaveCommand}" IsEnabled="False">
<TextBlock Text="Save"/>
</Button>
那么
private void GotFocus( object sender, RoutedEventArgs e )
{
SaveButton.IsEnabled = true;
}
或者你可以将一个命令附加到GotFocus事件上(https://dev59.com/cHNA5IYBdhLWcg3wNrAy),在ViewModel中设置一个布尔值,该值也会在“SaveCommand”的CanExecute方法中查询。
听起来你想把你的属性命名为IsDirty,并且只有在模型变脏时才能使用保存按钮。你可以在你的视图模型上拥有一个CanSave属性,当模型被加载时,它会检查新模型值与原始值之间的差异,例如:
public bool CanSave
{
get
{
return this.IsDirty;
}
}
public bool IsDirty
{
get
{
if (this.ModelPropertyValue != this.ModelOriginalPropertyValue)
{
return true;
}
return false;
}
}
private string modelPropertyValue;
public string ModelPropertyValue
{
get
{
return this.modelPropertyValue;
}
set
{
if (this.modelPropertyValue == value)
{
return;
}
this.modelPropertyValue = value;
OnPropertyChanged(() => this.ModelPropertyValue);
OnPropertyChanged(() => this.CanSave);
}
}
文本框默认只在失去焦点时更新其绑定属性,因此您需要在文本框上设置UpdateSourceTrigger属性:
<TextBox Text="{Binding ModelPropertyValue, UpdateSourceTrigger=PropertyChanged}" />
<Button IsEnabled="{Binding CanSave}">Save</Button>
如果你只有一个文本框,那么这是一种懒惰、快速而不太优雅的解决方案:
<TextBox Name="TB" Width="200"/>
<Button Content="Save">
<Button.Style>
<Style TargetType="Button">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=TB, Path=Text}" Value="">
<Setter Property="IsEnabled" Value="False"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
只要文本框中有文字,按钮就会启用。
EventTrigger
,实际上是两个。一个用于 GotFocus
事件,另一个用于 LostFocus
事件。在XAML中使用EventTrigger进行MVVM - 无需Code Behind Code
查找SetProperty
触发器动作。这对你很有用。