INotifyPropertyChanged не работает, когда свойство во второй раз устанавливает одно и то же значение - PullRequest
4 голосов
/ 26 августа 2011

Это код для воспроизведения этой проблемы:

xaml:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <TextBox Text="{Binding Num,  UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"></TextBox>
</Grid>

C #:

using System.ComponentModel;
using System.Windows;

namespace WpfApplication1
{
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new Entity();
    }
}

public class Entity : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private double num;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public double Num
    {
        get { return num; }
        set
        {
            num = value;
            if (value > 100)
            {
                num = 100;
            }
            OnPropertyChanged("Num");
        }
    }
}

}

Теперь, если я запускаю его, введите 1, все в порядке.Затем введите еще 1, что делает его 11, все в порядке.А затем введите еще 1, что составляет 111, теперь проверка будет работать и изменит значение на 100, а пользовательский интерфейс покажет 100. Но тогда, если я введу больше чисел, пользовательский интерфейс не изменится, это будет 1001.

Я думаю, это как-то связано с установкой для свойства одинакового значения (100) дважды.Но я понятия не имею, как это исправить, под ним я хочу, чтобы пользовательский интерфейс всегда следовал за значением свойства.

Спасибо

Ответы [ 3 ]

0 голосов
/ 26 августа 2011

на самом деле это должно работать до тех пор, пока ваш ввод в текстовое поле может автоматически преобразовываться в удвоение.Вы проверили свое окно вывода для исключений привязки?если вы отлаживаете со значениями вроде 1001, что происходит в вашем сеттере?

0 голосов
/ 26 августа 2011

Ввести уведомление об изменении свойства перед усечением num до 100 и одно сразу после усечения ...

вот так ...

        num = value; 
        OnPropertyChanged("Num");
        if (value > 100) 
        { 
            num = 100;
            OnPropertyChanged("Num"); 
        } 

Позвольте мне, если это поможет.

0 голосов
/ 26 августа 2011
    <Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
   <Window.Resources>
        <!--The Too tip for the textbox-->
        <Style x:Key="txterror" TargetType="{x:Type TextBox}">
            <Style.Triggers>
                <Trigger Property="Validation.HasError" Value="true">
                    <Setter Property="ToolTip"
             Value="{Binding RelativeSource={x:Static RelativeSource.Self},
              Path=(Validation.Errors)[0].ErrorContent}"></Setter>
                    <Setter Property="Background" Value="Red"></Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
       <TextBox x:Name="txt" Text="{Binding Mode=TwoWay, IsAsync=True, Path=Num,  UpdateSourceTrigger=PropertyChanged}" Margin="63,36,71,184" >
            <TextBox.Effect>
                <DropShadowEffect  ShadowDepth="5"/>
            </TextBox.Effect>
        </TextBox>
        <TextBox Margin="63,96,71,124" Text="{Binding ElementName=txt,Path=Text}">
            <TextBox.Effect>
                <DropShadowEffect ShadowDepth="5" />
            </TextBox.Effect>
        </TextBox>
    </Grid>
</Window>

Используйте приведенный выше код, он работает нормально.означает, что когда вы устанавливаете значение Num proeprty, оно устанавливает значение proerty равным 100, но значения текстового поля вашего widnow не изменяются.это из-за элемента фреймворка, в котором используется проверка ошибок, поэтому, что бы вы ни хотели поместить в текстовое поле, он напечатает его и отобразит это значение в текстовом поле.но значения свойства всегда равны 100, когда они превышают 100.

Ваше решение состоит в том, чтобы использовать IsAsync = True в вашем обязательном утверждении

...