У меня есть пользовательский элемент управления, который привязан к «SelectedSchedule», при щелчке по кнопке открывается окно, в котором можно редактировать «SelectedSchedule», работает нормально. В этом окне есть поле со списком с некоторым «SelectedSchedule» для выбора, которое SelectedItem-Property привязано к «SelectedSchedule». Когда я теперь выбираю другой объект в поле со списком, он не получает новый объект, просто ничего не происходит / не изменяется.
Что я делаю не так?
Пользовательский Control-XAML:
<Label Content = "{Binding Path=SelectedSchedule.Name}" Margin = "0,-6,0,0" HorizontalContentAlignment = "Center" VerticalContentAlignment = "Center" VerticalAlignment = "Center" HorizontalAlignment = "Center" FontSize = "20" Height = "32" Width = "87"/>
Пользовательский элемент управления-ViewModel
private Schedule mSelectedSchedule;
public Schedule SelectedSchedule
{
get { return mSelectedSchedule; }
set
{
mSelectedSchedule = value;
OnPropertyChanged("SelectedSchedule");
}
}
public EmployeeWeekCheckButon_VM(Schedule GivenSchedule)
{
SelectedSchedule = GivenSchedule;
}
private void Edit()
{
Forms.Tracking.View.frmEditTracking newForm = new Forms.Tracking.View.frmEditTracking(SelectedSchedule);
newForm.ShowDialog();
OnPropertyChanged("SelectedSchedule");
}
private void Delete()
{
SelectedSchedule = null;
}
Окно редактирования-XAML:
<ComboBox ItemsSource = "{Binding ListOfSchedule}" SelectedItem = "{Binding SelectedSchedule}" x:Name = "cmdSchedule" HorizontalAlignment = "Left" FontSize = "16" Margin = "17,27,0,0" VerticalAlignment = "Top" Width = "120"/>
Редактировать-Окно-ViewModel:
private Schedule _SelectedSchedule;
public Schedule SelectedSchedule
{
get { return _SelectedSchedule; }
set { _SelectedSchedule = value;
OnPropertyChanged("SelectedSchedule"); }
}
private ObservableCollection<object> _ListOfSchedule;
public ObservableCollection<object> ListOfSchedule
{
get { return _ListOfSchedule; }
set { _ListOfSchedule = value;
OnPropertyChanged("ListOfSchedule");
}
}
public frmEditTracking_VM(Schedule GivenSchedule)
{
SelectedSchedule = GivenSchedule;
}
private void SaveAndClose()
{
SelectedSchedule.isTracked = true;
OnClosingRequest();
}





Попробуйте установить привязку в двухстороннем режиме
SelectedItem = "{Binding SelectedSchedule, Mode=TwoWay}"
и когда диалоговое окно закрывается, вам необходимо установить новое значение, потому что нет связи между диалоговым окном и свойством модели просмотра "SelectedSchedule".
newForm.ShowDialog();
SelectedSchedule = newForm.SelectedSchedule;
Установка режима TwoWay ничего не меняет, и «newForm» не имеет свойства «SelectedSchedule», потому что я работаю с ViewModel, поэтому ViewModel имеет свойство. но спасибо!
Извините, вам необходимо предоставить доступ к свойству ViewModel диалогового окна, если вы хотите вернуть его в базовую ViewModel (или вернуть его с помощью свойства isTracked)
А как мне дать доступ? И почему он работает, когда я просто редактирую объект, но не когда я пытаюсь назначить новый объект?
вы можете добавить метод в код диалогового окна, например: GetSelectedSchedule (), поскольку диалоговое окно имеет доступ к его ViewModel (и у вас есть свойство DialogResult для уведомления базовой ViewModel, если свойство изменилось), или передать базовую ViewModel в качестве параметра для диалог вместо выбранного расписания затем сделал привязку типа: "ViewModel.SelectedSchedule"
Редакция работает, потому что оба свойства SelectedSchedule ссылаются на один и тот же объект, назначение не работает, потому что вы меняете свойство ViewModel диалога, а не базовое ViewModel.
большое спасибо!!! Решением было передать всю ViewModel, а не только SelectedSchedule. Спасибо!
Отметим, что свойство SelectedItem по умолчанию связывает TwoWay, поэтому параметр Mode=TwoWay является избыточным.
Спасибо за разъяснения, все время настраивал
Чтобы понять, почему редакция работает, а назначение нет, вы можете попробовать:
private Schedule mSelectedSchedule2;
public Schedule SelectedSchedule2
{
get { return mSelectedSchedule2; }
set
{
mSelectedSchedule2 = value;
OnPropertyChanged("SelectedSchedule2");
}
}
private Schedule _SelectedSchedule;
public Schedule SelectedSchedule
{
get { return _SelectedSchedule; }
set { _SelectedSchedule = value;
OnPropertyChanged("SelectedSchedule"); }
}
public EmployeeWeekCheckButon_VM(Schedule GivenSchedule)
{
SelectedSchedule = GivenSchedule;
SelectedSchedule2 = GivenSchedule;
SelectedSchedule.Name = "Test";
Debug.WriteLine(SelectedSchedule.Name) //it's Test
Debug.WriteLine(SelectedSchedule2.Name) //it's Test
SelectedSchedule = new Schedule();
SelectedSchedule.Name = "Test2";
Debug.WriteLine(SelectedSchedule.Name) //it's Test2
Debug.WriteLine(SelectedSchedule2.Name) //it's still Test because
//it's referencing the first object
}
Почему вы не отредактировали свой первый ответ, а не написали еще один?
Можно ли скопировать выбранное расписание без ссылки?
Потому что было проще скопировать / вставить исходный вопрос, чем использовать инструмент редактирования.
Извините, я неправильно использовал инструмент редактирования, я отредактирую свой ответ в следующий раз
Кажется, что SelectedSchedule установлен правильно в EditWindow. В режиме отладки в функции «SaveAndClose» у SelectedSchedule есть правильный новый объект. Но после OnClosingRequest, возвращаясь к UserControl, он возвращается к «исходному» SelectedSchedule. Простое редактирование SelectedSchedule (Name или ID) работает нормально, просто выбор нового SelectedSchedule не работает.