Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.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# 将文本框绑定到viewmodel中的对象_C#_.net_Wpf_Mvvm - Fatal编程技术网

C# 将文本框绑定到viewmodel中的对象

C# 将文本框绑定到viewmodel中的对象,c#,.net,wpf,mvvm,C#,.net,Wpf,Mvvm,在我的MVVM测试项目中,我想将文本框绑定到viewmodel中的对象: public class ContactViewModel : BaseNotifyPropertyChanged { Contact _selectedItem; public ContactViewModel() { ContactModel contactModel = new ContactModel(); _selectedItem = contactMo

在我的MVVM测试项目中,我想将文本框绑定到viewmodel中的对象:

public class ContactViewModel : BaseNotifyPropertyChanged
{
    Contact _selectedItem;

    public ContactViewModel()
    {
        ContactModel contactModel = new ContactModel();
        _selectedItem = contactModel.ContactList[1];  // this contains first contact from the list; 
    }
}

public Contact SelectedContact
{
    get
       {
          return _selectedItem;
       }
}
在我的联系人类中,我重写ToString方法以显示第一个联系人的名字:

public override string ToString()
{
   return _firstName.ToString();
}
下面是我的XAML绑定:

<TextBox Height="23" HorizontalAlignment="Left" Name="SelectedItemTextBox" Text="{Binding Path=SelectedContact}" VerticalAlignment="Top" Width="120" />

它工作得很好

啊,找到了,我只是把我的文本框改成了文本块,现在一切都正常了


似乎TextBlock确实理解如何显示对象,但TextBox不理解

啊,找到了,我只是把我的文本框改成了文本块,现在一切都正常了


似乎TextBlock确实理解如何显示对象,但TextBox不理解

啊,找到了,我只是把我的文本框改成了文本块,现在一切都正常了


似乎TextBlock确实理解如何显示对象,但TextBox不理解

啊,找到了,我只是把我的文本框改成了文本块,现在一切都正常了


似乎TextBlock确实理解如何显示对象,但TextBox不理解

我猜您在MSDN上看到了这篇文章:

这篇文章说,ListBox的标准表示形式是其内容的ToString表示形式的列表,而不是所有其他元素的情况


我强烈建议您为Contact类创建一个数据绑定模板,与重写ToString相比,这是实现此行为的一种更为干净的方法。

我猜您在MSDN上遵循了这篇文章:

这篇文章说,ListBox的标准表示形式是其内容的ToString表示形式的列表,而不是所有其他元素的情况


我强烈建议您为Contact类创建一个数据绑定模板,与重写ToString相比,这是实现此行为的一种更为干净的方法。

我猜您在MSDN上遵循了这篇文章:

这篇文章说,ListBox的标准表示形式是其内容的ToString表示形式的列表,而不是所有其他元素的情况


我强烈建议您为Contact类创建一个数据绑定模板,与重写ToString相比,这是实现此行为的一种更为干净的方法。

我猜您在MSDN上遵循了这篇文章:

这篇文章说,ListBox的标准表示形式是其内容的ToString表示形式的列表,而不是所有其他元素的情况


我强烈建议您为Contact类创建一个数据绑定模板,这是实现此行为的一种比重写ToString更干净的方法。

Stanislav,您在其他地方犯了一个错误。您试图绑定到对象,但绑定不知道显示什么并将
ToString()
应用到您的
联系人
对象。如果您重写了
ToString()
,它必须显示此方法的返回值我创建了测试应用程序,它就是这样工作的

我在您的代码中看到的是,在
ToString()
中,您返回了
FirstName
,但在changed
SelectedContact
中,它是
SecondName
-您以前填写过FirstName吗

您在试图访问第一个元素的注释中写道,但在代码中,您使用了联系人列表的第二个元素

此外,以这种方式使用绑定是不正确的。如果要访问LastName,请使用下一种方式:

   <TextBox Text="{Binding Path=SelectedContact.LastName, Mode=OneTime}" />

并删除
ToString()
覆盖

编辑:与其他控件不同,在
文本框
中,绑定默认为单向,默认为双向。之所以这样做,是因为
TextBox
的本机行为是显示和编辑值(而不仅仅是在其他控件中显示)。此外,如果您不打算更改值(您不打算更改,因为
ContactModel
未实现
INotifyPropertyChanged
),建议使用
OneTime
模式(以提高性能)


TwoWay
有一些限制-您不能将其用于只读属性(
SelectedContact
在您的代码中是只读的)。因为在这种情况下绑定不能更改值——这是有意义的。奇怪的是,应用程序在您的案例中午餐,而
TextBox
是空的,因为在我的案例中,我得到了一个错误“双向或单向源绑定无法在类型为'WpfApplication1.ContactViewModel'的只读属性'SelectedContact'上工作”。直到我在
TextBox
中更改了绑定模式,你在别的地方犯了个错误。您试图绑定到对象,但绑定不知道显示什么并将
ToString()
应用到您的
联系人
对象。如果您重写了
ToString()
,它必须显示此方法的返回值我创建了测试应用程序,它就是这样工作的

我在您的代码中看到的是,在
ToString()
中,您返回了
FirstName
,但在changed
SelectedContact
中,它是
SecondName
-您以前填写过FirstName吗

您在试图访问第一个元素的注释中写道,但在代码中,您使用了联系人列表的第二个元素

此外,以这种方式使用绑定是不正确的。如果要访问LastName,请使用下一种方式:

   <TextBox Text="{Binding Path=SelectedContact.LastName, Mode=OneTime}" />

并删除
ToString()
覆盖

编辑:与其他控件不同,在
文本框
中,绑定默认为单向,默认为双向。之所以这样做,是因为
TextBox
的本机行为是显示和编辑值(而不仅仅是在其他控件中显示)。此外,如果您不打算更改值(您不打算更改,因为
ContactModel
未实现
INotifyPropertyChanged
),建议使用
OneTime
模式(以提高性能)

TwoWay
有一些限制-您不能将其用于只读属性(
Se