C# 从视图模型访问窗口时,它始终为空
我想做的是在LoginWindow.xaml.cs派生的接口类型的模型ComboBoxItemChange.cs中创建属性。使用此属性,我希望授予对LoginWindow中元素的访问权限。我确信这是使用MVVM模式实现的正确方法。C# 从视图模型访问窗口时,它始终为空,c#,wpf,mvvm,C#,Wpf,Mvvm,我想做的是在LoginWindow.xaml.cs派生的接口类型的模型ComboBoxItemChange.cs中创建属性。使用此属性,我希望授予对LoginWindow中元素的访问权限。我确信这是使用MVVM模式实现的正确方法。 我的问题是属性总是空的。 LoginWindow.xaml.cs public partial class LoginWindow : Window, ILoginView { public LoginWindow() { Initi
我的问题是属性总是空的。
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);
}
}
public class ComboBoxItemChange : INotifyPropertyChanged
{
public ILoginView LoginWindow { get; set; }
private void ChangeloginWindowInputFields(string value)
{
if (LoginWindow == null)
return;
LoginWindow.ChangeInputFieldsByRole(value);
}
}
public interface ILoginView
{
void ChangeInputFieldsByRole(string role);
}
ComboBoxItemChange.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);
}
}
public class ComboBoxItemChange : INotifyPropertyChanged
{
public ILoginView LoginWindow { get; set; }
private void ChangeloginWindowInputFields(string value)
{
if (LoginWindow == null)
return;
LoginWindow.ChangeInputFieldsByRole(value);
}
}
public interface ILoginView
{
void ChangeInputFieldsByRole(string role);
}
ILoginView.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);
}
}
public class ComboBoxItemChange : INotifyPropertyChanged
{
public ILoginView LoginWindow { get; set; }
private void ChangeloginWindowInputFields(string value)
{
if (LoginWindow == null)
return;
LoginWindow.ChangeInputFieldsByRole(value);
}
}
public interface ILoginView
{
void ChangeInputFieldsByRole(string role);
}
如评论中所述:
您正在创建两个不同的实例:
- 一个位于代码隐藏中,您可以将
设置为窗口本身ILoginView
- 网格资源中第二个未设置
ILoginView
删除您在XAML中声明的实例并让绑定从您在代码隐藏中创建的实例解析。(子控件将自动继承DataContext)。是否确实ComboBoxItemChange的实例相同?是否确实没有从其他位置调用构造函数
new ComboBoxItemChange()代码>在您的代码中?嗯,我在整个解决方案中搜索了这个类名,在我的LoginWindow.xaml中有树匹配-1)公共类ComboBoxItemChange:INotifyPropertyChanged
2)公共ComboxItemChange()
这是该类中的构造函数3)
。基本上,这个类只被属性更改触发器使用,仅此而已。您正在使用XAML中声明的那个类。最有可能的问题只是那个实例。您可以发布XAML代码以了解其使用情况吗?因此,您可以从code behind设置DataContext
,并为该实例设置ILoginView。但在XAML中,创建另一个实例并使用它。只需从XAML中删除实例,并使用在代码隐藏中创建的实例。