Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从视图模型访问窗口时,它始终为空_C#_Wpf_Mvvm - Fatal编程技术网

C# 从视图模型访问窗口时,它始终为空

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派生的接口类型的模型ComboBoxItemChange.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);
    }
}
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中删除实例,并使用在代码隐藏中创建的实例。