Vipin_Sharma_ Ответов: 1

Обновленное значение не отражается в графическом интерфейсе WPF


Я создал одно приложение Tab, которое содержит одно главное окно и связанную вкладку, каждая вкладка имеет отдельную модель представления.
Каждая вкладка инициализируется одна за другой, как только приложение будет открыто должным образом, то я хочу обновить некоторые значения из второй вкладки, и эти изменения должны быть отражены на первой вкладке.
Поэтому я реализовал событие INotifyPropertChanged, связанное с этими свойствами, но оно не отражено на первой вкладке.
Похоже, есть какая-то проблема в том, что DataContext не обновляется должным образом при изменении значения во второй вкладке.

Что я уже пробовал:

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

Спасибо.

<pre>//First tab initialization .
public partial class PersonUserControl : UserControl
    {
        /// <summary>
        ///     Default constructor.
        /// </summary>
        public PersonUserControl ()
        {
            InitializeComponent();

            // Allow for UserControl to init successfully within VS Designer.
            if ( !DesignerProperties.GetIsInDesignMode(this) )
            {
                DataContext = new PersonViewModel();
            }
        }

 //First tab View- Model: PersonViewModel.cs

 public string JoinDate
        {
            get
            {
                return _joinDate;
            }
            set
            {
                if (_joinDate != value)
                {
                    _joinDate = value;
                    OnPropertyChanged("JoinDate");
                }
            }
        }

//First Tab XAML component.

<pre> <TextBlock FontWeight="Bold" 
               Height="28" 
               HorizontalAlignment="Left" 
               Margin="30,350,0,0"
               Text="{Binding JoinDate, Mode=OneWay}" 
               VerticalAlignment="Top" />


//Second tab initialization.

public partial class UpdateInfoControl : UserControl
    {
        /// <summary>
        ///     Default constructor.
        /// </summary>
        public UpdateInfoControl()
        {
            InitializeComponent();

            // Allow for UserControl to init successfully within VS Designer.
            if ( !DesignerProperties.GetIsInDesignMode(this) )
            {
                DataContext = new UpdateInfoModel();
            }
        }

//Second tab View-Model: UpdateInfoModel.cs

public DateTime TimeOfDay
        {
            get
            {
                return _timeOfDay;
            }
            set
            {
		if ( _timeOfDay != value )
		  {
		          _timeOfDay = value;
		           OnPropertyChanged("TimeOfDay");
		
			_updateInfoViewModel.JoinDate = timeOfDay .ToString();
		}
		
             }
}

//Second Tab XAML component.

<DatePicker Height="26"
                          HorizontalAlignment="Right"
                          Margin="0,69,239,0"
                          SelectedDate="{Binding TimeOfDay, Mode=TwoWay}"
                          SelectedDateFormat="Long"
                          VerticalAlignment="Top"
                          Width="208" />

[no name]

Не могли бы вы показать нам свой код?

Vipin_Sharma_

Я обновился.

Kenneth Haugland

А код XAML?

Vipin_Sharma_

Я обновился.

Gerry Schmitz

Почему у вас есть "OneWay" на текстовом блоке? Текстовый блок может быть только "односторонним".

Почему вы конвертируете даты в строки перед их отображением?

Почему бы вам просто не привязать оба элемента управления к одному источнику?

Vipin_Sharma_

Я использую TextBlock для отображения обновленной даты, поток данных идет только одним способом, получить обновленную дату из DatePicker.
Мне нужно использовать Tostring("D").
Оба элемента управления имеют разные представления и модели представлений.

1 Ответов

Рейтинг:
1

Kenneth Haugland

Я не вижу, чтобы INotifyPropertChanged был реализован в вашем свойстве JoinDate. Вы должны сделать что-то похожее на реализацию здесь:
INotifyPropertyChanged Интерфейс (System.ComponentModel)[^]

Соответствующий образец:

public class YourClass : INotifyPropertyChanged
   {

       public event PropertyChangedEventHandler PropertyChanged;
       private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
       {
           if (PropertyChanged != null)
           {
               PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
           }
       }

       public string JoinDate
       {
           get
           {
               return _joinDate;
           }

           set
           {
               if (value != _joinDate)
               {
                   _joinDate = value;
                   NotifyPropertyChanged();
               }
           }
       }
   }


Vipin_Sharma_

Я сделал ту же самую реализацию интерфейса INotifyPropertyChanged, но он не отражается в первой вкладке при изменении даты со второй вкладки.