除非绑定,否则属性返回null?

时间:2018-07-10 14:03:57

标签: c# wpf mvvm

         Window2 X = new Window2();
        var taskViewModel = (XViewModel)X.DataContext;
        taskViewModel.Name = Username;
        X.Show();

我努力工作了好几个小时,以为上面的代码不能正常工作。 因为例如如果我以第二种形式将Name绑定到Textblock,则该值将显示出来。如果我使用Console.Write编写它或尝试在MessageBox中显示它,则返回null,则不会显示任何内容。是什么原因造成的?

 public string Name
      {
          get { return _Name; }
          set
          {
              _Name = value;
              NotifyOfPropertyChange("Name");
          }
      }

     Public XViewModel()
    {
        MessageBox.Show(Name);
    }

就像这样,上面的messageBox将为空。但是,如果我这样做:

<TextBlock FontWeight="Bold" Text="{Binding Name}" ></TextBlock>

使用第一个代码打开窗口后,它将正确显示。

编辑:我试图制作一个按钮并绑定了一个调用MessageBox的命令。在这种情况下,名称将正确显示

EDIT2:这也不起作用:

        Window2 w = new Window2();
        XViewModel vm = new XViewModel ();
        vm.Name = Username;
        w.DataContext = vm;
        w.Show();

1 个答案:

答案 0 :(得分:2)

问题是您正试图在设置属性之前在构造函数中显示Name:

    // Here i think you are creating XViewModel
    Window2 X = new Window2();

    //Here where the Messagebox shows

    var taskViewModel = (XViewModel)X.DataContext;

    //Here you set the property
    taskViewModel.Name = Username;

    // Now the value is correctly shown in the textblock
    X.Show();

在创建对象XViewModel之后尝试设置属性的值:

public class Window2
{
   public Window2(XViewModel vm)
   {
       InitializeComponent();

       DataContext = vm;
   }
}

编辑:

让我们做点其他事情:

以这种方式定义 XViewModel 类:

public class XViewModel
{
   public XViewModel(String nameProp)
   {
      Name = nameProp;
      MessageBox.Show(Name);
    }
   // Your Properties
   // Your Methods
}


// Create XViewModel and pass it to Window 2
var taskViewModel = new XViewModel(Username);   //HERE where messagebox shows

Window2 X = new Window2(taskViewModel);

// Now the value is correct shown in the textblock
X.Show();