Проблема привязки WPF с обновлением значений - PullRequest
0 голосов
/ 11 июля 2009

У меня есть файл .xaml и файл .cs, которые имеют общее значение с Binding.

Для простоты у меня есть 1 кнопка и 1 текстовое поле. Я хочу, чтобы кнопка была отключена, если в текстовом поле нет символа.

Вот два кода xaml для привязки:

  <TextBox Name="txtSend" Text="{Binding Path=CurrentText,UpdateSourceTrigger=PropertyChanged}"></TextBox>
    <Button IsEnabled="{Binding Path=IsTextValid}"  Name="btnSend">Send</Button>

Два свойства в файле .cs выглядят так:

    public string CurrentText
    {
        get
        {
            return this.currentText;
        }
        set
        {
            this.currentText = value;
            this.PropertyChange("CurrentText");
            this.PropertyChange("IsTextValid");
        }
    }

    public bool IsTextValid
    {
        get
        {
            return this.CurrentText.Length > 0;
        }
    }

this.PropertyChanged - это просто метод, который вызывает PropertyChanged из INotifyPropertyChanged.

Проблема в том, что мне нужно вызвать this.PropertyChange("IsTextValid"); в установщике CurrentText, чтобы можно было изменить состояние кнопки.

Вопрос 1) Это хороший способ сделать это ... если правила становятся более сложными, мне может потребоваться вызвать много PropertyChanged ...?

Вопрос 2) Моя кнопка активируется при загрузке формы. Как я могу заставить его проверить метод с самого начала?

Ответы [ 2 ]

2 голосов
/ 11 июля 2009

Вопрос 1: Это правильно. Это не проблема. Однако вы можете взглянуть на проверку с использованием IDataErrorInfo. (Поищите в Google, и вы найдете много хороших примеров)

Вопрос 2: убедитесь, что строка «currentText» инициализирована с помощью string.empty. Потому что, если вы не инициализировали его, он будет нулевым, и получатель для IsTextValid выдаст исключение, а WPF не сможет получить значение.

Или сделай так:

public bool IsTextValid
{
    get
    {
        return ! string.IsNullOrEmpty( this.CurrentText );
    }
}
0 голосов
/ 08 декабря 2015

Ваш способ сделать это правильно. Если вы немного ленивы (как и я), вам следует взглянуть на пакет NuGet Fody.PropertyChanged.

Ваш код упростится до

public string CurrentText { get; set; }

public bool IsTextValid { get { return this.CurrentText.Length > 0; } }

Fody.PropertyChanged сделает все остальное за вас. Он автоматически добавляет необходимые инструкции для уведомления об изменении CurrentText и даже обнаруживает, что IsTextValid зависит от CurrentText, и также уведомляет об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...