TextBox的Text通过DataTrigger设置,不更新Model中的属性值

时间:2013-05-06 11:14:38

标签: wpf datatrigger

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

以下是代码:

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

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

,“Amount”早期设置值在TextBox中再次设置

感谢任何帮助。如果您需要更多信息或说明,请告知我们 感谢。

1 个答案:

答案 0 :(得分:6)

在这种情况下,我通常更喜欢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
  }
}

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

<强>更新

代码问题是在Text中使用绑定设置TextBox时,它优先于您在Text属性的Style中设置的值。您可以使用以下方法检查:

<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被选中时,这将清除文本,但它不会更新您的绑定(Amount),因为基本上您的绑定仅在选择CheckBox时才有效