C# 将文本框绑定到viewmodel中的对象
在我的MVVM测试项目中,我想将文本框绑定到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
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
,但在changedSelectedContact
中,它是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
,但在changedSelectedContact
中,它是SecondName
-您以前填写过FirstName吗
您在试图访问第一个元素的注释中写道,但在代码中,您使用了联系人列表的第二个元素
此外,以这种方式使用绑定是不正确的。如果要访问LastName,请使用下一种方式:
<TextBox Text="{Binding Path=SelectedContact.LastName, Mode=OneTime}" />
并删除ToString()
覆盖
编辑:与其他控件不同,在文本框
中,绑定默认为单向,默认为双向。之所以这样做,是因为TextBox
的本机行为是显示和编辑值(而不仅仅是在其他控件中显示)。此外,如果您不打算更改值(您不打算更改,因为ContactModel
未实现INotifyPropertyChanged
),建议使用OneTime
模式(以提高性能)
TwoWay
有一些限制-您不能将其用于只读属性(Se