#c# #wpf #mvvm
#c# #wpf #mvvm
Вопрос:
Что я хочу сделать, так это создать свойство в модели ComboBoxItemChange.cs типа ILoginView, который является интерфейсом, который выводит LoginWindow.xaml.cs. Используя это свойство, я хочу предоставить доступ к элементам внутри LoginWindow. Я считаю, что это правильный способ сделать это с использованием шаблона MVVM.
Моя проблема в том, что свойство всегда равно нулю.
LoginWindow.xaml.cs
public partial class LoginWindow : Window, ILoginView
{
public LoginWindow()
{
InitializeComponent();
this.DataContext = new ComboBoxItemChange();
(this.DataContext as ComboBoxItemChange).LoginWindow = this as ILoginView;
}
public void ChangeInputFieldsByRole(string role)
{
MessageBox.Show(role);
}
}
ComboBoxItemChange.cs
public class ComboBoxItemChange : INotifyPropertyChanged
{
public ILoginView LoginWindow { get; set; }
private void ChangeloginWindowInputFields(string value)
{
if (LoginWindow == null)
return;
LoginWindow.ChangeInputFieldsByRole(value);
}
}
ILoginView.cs
public interface ILoginView
{
void ChangeInputFieldsByRole(string role);
}
Комментарии:
1. Вы уверены, что экземпляры одинаковы для ComboBoxItemChange?
2. Вы уверены, что не вызываете конструктор из другого места
new ComboBoxItemChange();
в своем коде?3. Ну, я искал это имя класса во всем решении, были совпадения по дереву — 1)
public class ComboBoxItemChange : INotifyPropertyChanged
2)public ComboBoxItemChange()
это конструктор в этом классе 3)<Grid.Resources><src:ComboBoxItemChange x:Key="myDataSource"/></Grid.Resources>
внутри моего LoginWindow.xaml. В основном этот класс используется только триггером изменения свойств, вот и все.4. Что вы делаете с тем, который объявлен в XAML. Скорее всего, проблема заключается только в этом экземпляре. Можете ли вы опубликовать код XAML для его использования?
5. Итак, это проблема, которую вы задаете
DataContext
из кода и устанавливаете ILoginView для этого экземпляра. Но в XAML вы создаете другой экземпляр и используете его. Просто удалите экземпляр из XAML и используйте экземпляр, созданный в коде.
Ответ №1:
Как указано в комментарии:
Вы создаете два разных экземпляра:
- Один в коде позади того, где вы установили
ILoginView
значение window само - Второй в ресурсах сетки, которые вы не установили
ILoginView
.
Удалите экземпляр, который вы объявили в XAML, и разрешите разрешать привязки из экземпляра, созданного вами в коде. (DataContext будет автоматически наследоваться для дочерних элементов управления).