Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TextBox's Text set through DataTrigger not updating the property value in Model

I am new to WPF and I want to clear a textBox's value if a check box is unchecked. I tried doing that through data triggers.

Below is the code:

<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 checkbox's value is set in "IsSelected" property of My Model. Here, if the checkbox is unchecked, then the text's updated value, which is {x:Null} in this case, is not reflecting in "Amount" property of my Model. Because of this the text never seems to be changed on the UI. The "Amount" earlier set value is getting set again in the TextBox because of binding

Any help is appreciated. Let me know in case you need any more information or clarification Thanks.

like image 637
DareToExplore Avatar asked Mar 24 '23 01:03

DareToExplore


1 Answers

In such cases I normally prefer ViewModel / Model doing the "clear" part of the functionality,

hence in your case I'd normally do something like:

public bool IsSelected {
  get {
    return _isSelected;
  }

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

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

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

That way the View does not hold responsibility for any logic and thus doesn't need the DataTrigger at all

Update:

The Problem with your code is when you set the Text with a Binding in the TextBox it takes precedence over the value you set in the Style for the Text property. You can check this by using this:

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

This will now clear the Text when the CheckBox is checked, however it will not be updating your Binding(Amount) since essentially your Binding is only active when the CheckBox is selected.

like image 154
Viv Avatar answered Apr 03 '23 04:04

Viv