4

我是 WPF 新手,如果未选中复选框,我想清除文本框的值。我尝试通过数据触发器来做到这一点。

下面是代码:

<TextBox Text="{Binding Path=Amount,Mode=TwoWay}">
                    <TextBox.Style>
                        <Style>
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Path=IsSelected}" Value="false">
                                    <Setter Property="TextBox.Text" Value="{x:Null}"></Setter>
                                </DataTrigger>  
                            </Style.Triggers>
                        </Style>
                    </TextBox.Style>
                </TextBox> 

我的复选框的值在我的模型的“IsSelected”属性中设置。在这里,如果未选中复选框,则文本的更新值(在这种情况下为 {x:Null})不会反映在我的模型的“金额”属性中。因此,UI 上的文本似乎永远不会更改。由于绑定,“金额”较早的设置值在 TextBox 中再次设置

任何帮助表示赞赏。如果您需要更多信息或澄清,请告诉我。谢谢。

4

1 回答 1

7

在这种情况下,我通常更喜欢 ViewModel / Model 执行功能的“清晰”部分,

因此,在您的情况下,我通常会执行以下操作:

public bool IsSelected {
  get {
    return _isSelected;
  }

  private set {
    if (value == _isSelected)
      return;

    RaisePropertyChanging(() => IsSelected);
    _isSelected = value;
    RaisePropertyChanged(() => IsSelected);

    if (_isSelected == false)
      Amount = string.Empty
  }
}

这样视图不对任何逻辑负责,因此根本DataTrigger不需要

更新:

您的代码的问题是当您在Text其中设置 Binding 时,TextBox它优先于您在StyleText 属性中设置的值。您可以使用以下方法进行检查:

<TextBox>
  <TextBox.Style>
    <Style TargetType="{x:Type TextBox}">
      <Setter Property="Text"
              Value="{Binding Path=Amount,
                              Mode=TwoWay}" />
      <Style.Triggers>
        <DataTrigger Binding="{Binding Path=IsSelected}"
                      Value="false">
          <Setter Property="Text"
                  Value="{x:Null}" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </TextBox.Style>
</TextBox>

现在,这将在选中 时清除文本CheckBox,但是它不会更新您的 Binding( Amount),因为本质上您的 Binding 仅在选择 时才处于活动状态CheckBox

于 2013-05-06T11:25:34.123 回答