Как обновить значение привязки WPF из кода C # позади? - PullRequest
0 голосов
/ 01 февраля 2012

Использовал следующий фрагмент кода для привязки свойства к текстовому полю.Значение свойства обновляется, а значение текстового поля изменяется в пользовательском интерфейсе.Но я присвоил значение текстовому полю в коде позади [txtNoOfSessions.Text = "1"], но оно не отражает значение в свойстве.

 <TextBox x:Name="txtNoOfSessions" 
          Text="{Binding Path=NoOfSessions,Mode=TwoWay}" 
          Height="23" Width="120" />

Ответы [ 5 ]

3 голосов
/ 01 февраля 2012

Используйте INotifyPropertyChanged для свойства. В противном случае он не будет обновляться после загрузки пользовательского интерфейса.

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

Пример:

public string PhoneNumber
{
    get
    {
        return this.phoneNumberValue;
    }

    set
    {
        if (value != this.phoneNumberValue)
        {
            this.phoneNumberValue = value;
            NotifyPropertyChanged("PhoneNumber");
        }
    }
}
2 голосов
/ 01 февраля 2012

Проблема в том, что привязка будет обновлять значение свойства только тогда, когда элемент управления по умолчанию теряет фокус.

Попробуйте это:

<TextBox 
    Name="txtNoOfSessionstxtNoOfSessions" 
    Text="{Binding Path=NoOfSessions, UpdateSourceTrigger=PropertyChanged}" 
    Height="23" 
    Width="120" /> 

Если установить UpdateSourceTrigger на PropertyChanged, txtNoOfSessions.Text = "1" будет работать нормально.

Спасибо, Алекс.

1 голос
/ 01 февраля 2012

Обычно я стараюсь не обновлять привязанные к базе данных значения из кода за пользовательским интерфейсом, однако, если мне нужно, я использую DataContext объекта пользовательского интерфейса и обновляю свойство bound.

В вашем примере это будет выглядеть примерно так:

MyDataObject obj = txtNoOfSessions.DataContext as MyDataObject;
if (obj != null)
    obj.NoOfSessions = "New Value";
0 голосов
/ 19 марта 2014

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

Вы можете использовать выше или ((dynamic)this.DataContext).NoOfSession = "New Value";, как я это делаю.

Таким образом, код будет работать без знания типа модели представления. Модель представления может даже быть ExpandoObject вместо класса, и она все равно будет работать.

Обратите внимание, что ExpandoObject привязка данных не работает в приложениях Магазина Windows.

https://connect.microsoft.com/VisualStudio/feedback/details/836252/databinding-in-windows-store-apps-to-an-expandoobject-change-notification-not-working

0 голосов
/ 01 февраля 2012

txtNoOfSession.Text связан. Установите значение связанного свойства. Это установлено NoOfSessions в вашей модели представления.

NoOfSessions = 1

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