当控件获取焦点时,更新ViewModel中的属性

3
我在寻找正确的XAML语法,以设置我的Viewmodel中的属性(例如"BusyEditing"),该属性已经与一个按钮的“IsEnabled”绑定相关联。基本上,我想要在我开始编辑字段时立即启用“保存”按钮。更酷的是,如果在文本框值改变时而不仅仅是GotFocus时更新该属性,那就太好了。谢谢。
5个回答

3
您可以使用命令(Commanding)轻松完成此操作。如果您在ViewModel中将一个命令绑定到按钮,并且CanExecute方法从其他输入中查找有效信息,则该按钮将保持禁用状态,直到满足条件。

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>

0

最简单的方法是在代码后台完成,尽管这对于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方法中查询。


0

听起来你想把你的属性命名为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>

0

如果你只有一个文本框,那么这是一种懒惰、快速而不太优雅的解决方案:

    <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>

只要文本框中有文字,按钮就会启用。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接