При доступе к окну из модели представления оно всегда равно нулю

#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 будет автоматически наследоваться для дочерних элементов управления).