текстовое поле не сбрасывается, несмотря на то, что свойство, к которому оно привязано, имеет значение null - PullRequest
0 голосов
/ 19 марта 2020

У меня есть текстовое поле в форме, текстовое свойство которого не сбрасывается, несмотря на то, что строковое свойство, к которому оно привязано, имеет значение null. Доступ контролируется другим флажком, который называется cbxPartIINA, в форме. Когда проверяется cbxPartIINA, текстовое поле должно быть отключено и отключено. Когда я проверяю cbxPartIINA, текстовое поле отключается, но не очищается.

Вот XAML для текстового поля:

    <TextBox Grid.Row="1" Grid.Column="0" HorizontalAlignment="Left" MaxLength="25" 
                        MinWidth="200" CharacterCasing="Upper" BorderThickness="0" Style="{StaticResource PartIIGridIsEnabledTextBox}"
                        Margin="5,2,0,3" FontWeight="Bold" Name="tbxNewSuspectLastName" 
                        Text="{Binding Form104CModel.NewSuspectLastName, Mode=TwoWay}"/>

Вот ресурс stati c:

       <Style TargetType="TextBox" x:Key="PartIIGridIsEnabledTextBox">
            <!-- This style is used to turn off TextBoxes in Part II-->
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsChecked, ElementName=cbxPartIINA}" Value="False">
                    <Setter Property="IsEnabled" Value="True"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding IsChecked, ElementName=cbxPartIINA}" Value="True">
                    <Setter Property="IsEnabled" Value="False"/>
                    <Setter Property="Text" Value=""/>
                </DataTrigger>
            </Style.Triggers>
            <Setter Property="FontWeight" Value="Bold"></Setter>
        </Style>

Вот XAML для флажка, который, когда установлен, отключает текстовое поле:

 <CheckBox Grid.Column="1" Content="NA" Background="White" Height="20" Width="auto" BorderBrush="Black" Name="cbxPartIINA" 
                          IsChecked="{Binding Path=Form104CModel.IsPartIINA, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

А вот свойство, к которому привязан textbox.text:

    private String newsuspectlastname;
    public String NewSuspectLastName
    {
        get
        {
            return this.newsuspectlastname;
        }
        set
        {
            this.newsuspectlastname = value;
            this.NewSuspect.LastName = value;
        }
    }

Свойство textbox.text не сбрасывается, несмотря на тот факт, что привязка является двусторонней, а для базового свойства NewSuspectLastName установлено значение null.

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

WPF использует INotifyPropertyChanged для мониторинга изменений в базовой модели.

Вам необходимо внедрить INotofyPropertyChanged в вашей модели следующим образом:

public class MyModel: INotifyPropertyChanged  
{
    public event PropertyChangedEventHandler PropertyChanged;  

    // This method is called by the Set accessor of each property.  
    // The CallerMemberName attribute that is applied to the optional propertyName  
    // parameter causes the property name of the caller to be substituted as an argument.  
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")  
    {  
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }  

    private String newsuspectlastname;
    public String NewSuspectLastName
    {
        get
        {
            return this.newsuspectlastname;
        }
        set
        {
            if (value != this.newsuspectlastname )  
             {  
                 this.newsuspectlastname = value;
                 this.NewSuspect.LastName = value;
                 NotifyPropertyChanged();  
            }  

        }
    }
}
0 голосов
/ 20 марта 2020

Это связано с тем, что вы устанавливаете привязку текста на уровне объекта, а не на уровне стиля. Установка свойства непосредственно для объекта всегда будет иметь приоритет над значением, установленным стилем. Чтобы достичь того, что вам нужно, вам просто нужно переместить привязку к стилю, например так:

<Style TargetType="TextBox" x:Key="PartIIGridIsEnabledTextBox">
    <!-- This style is used to turn off TextBoxes in Part II-->
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsChecked, ElementName=cbxPartIINA}" Value="False">
            <Setter Property="IsEnabled" Value="True"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding IsChecked, ElementName=cbxPartIINA}" Value="True">
            <Setter Property="IsEnabled" Value="False"/>
            <Setter Property="Text" Value=""/>
        </DataTrigger>
    </Style.Triggers>
    <Setter Property="FontWeight" Value="Bold"></Setter>
    <Setter Property="Text" Value="{Binding Form104CModel.NewSuspectLastName, Mode=TwoWay}"/>
</Style>

И ваш TextBox будет выглядеть так:

<TextBox Grid.Row="1" Grid.Column="0" HorizontalAlignment="Left" MaxLength="25" MinWidth="200" CharacterCasing="Upper" BorderThickness="0" Style="{StaticResource PartIIGridIsEnabledTextBox}" Margin="5,2,0,3" FontWeight="Bold" Name="tbxNewSuspectLastName"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...