C# MVVM设计问题

C# MVVM设计问题,c#,wpf,xml,mvvm,C#,Wpf,Xml,Mvvm,我的问题是使用列表和列表视图进行操作。Listview的itemsSource属性绑定到我的类中的列表(比如list) 我既要修改现有项目,也要向列表中添加新项目。因此,我为Contact类中的每个元素(姓名、姓氏等)创建了文本框 现在,如果要修改所选项目,请将每个文本框的Text属性设置为: <TextBox Text="{Binding ElementName=listView1, Path=SelectedItem.Name}"/> 如果我想创建新元素。我必须这样做: &

我的问题是使用列表和列表视图进行操作。Listview的itemsSource属性绑定到我的类中的列表(比如list)

我既要修改现有项目,也要向列表中添加新项目。因此,我为Contact类中的每个元素(姓名、姓氏等)创建了文本框

现在,如果要修改所选项目,请将每个文本框的Text属性设置为:

<TextBox Text="{Binding ElementName=listView1, Path=SelectedItem.Name}"/>

如果我想创建新元素。我必须这样做:

<TextBox Text="{Binding ElementName=tempContact, Path=Name}"/>

其中tempContact是最近通过按钮添加到列表中的Contact类的实例


问题是我想添加和修改这个列表的元素,我需要一个想法。有人能帮我一下吗?

我想在您的ViewModel中添加一个属性,该属性是当前编辑的对象。然后,在ViewModel中创建要添加到列表中的命令。例如,NewObjectCommand。在该命令中,您将切换当前正在编辑“新项”的状态(可能是布尔值),创建新对象。如果未添加新对象,EditedObject属性将返回列表中当前选定的对象;如果正在添加,则返回正在编辑的新项

当状态更改且EditedObject属性的逻辑值可能更改时,您需要在InotifyPropertyChanged接口上引发PropertyChanged事件,以更新绑定。您应该将包含编辑对象控件的视图绑定到ViewModel的EditedObject属性,并确保列表框绑定到ViewModel的列表,并且ViewModel可以跟踪列表中当前选定的对象

您必须弄清楚是什么触发机制导致对象被添加到列表中,然后您必须在添加对象后将状态更改回选定项。您可能还需要一些与IDataErrorInfo或类似的验证逻辑

长话短说:

  • 在ViewModel中创建状态变量
  • 将EditedObject作为属性公开;如果正在添加新对象,则返回新对象,否则返回列表中当前选定的项
  • 坚持

要从
文本框
向列表中添加项目,请在
视图模型
中创建字符串类型的属性,并在属性更改时通知。您还必须为编辑创建一个类似的属性,并存储
列表视图中所选项目的当前索引

string contactName;
public string ContactName
{
    get 
    {
       return contactName; 
    }
    set 
    {
       contactName = value; 
       OnPropertyChanged("ContactName");
    }
}

private string editedName;
public string EditedName
{
    get { return editedName; }
    set
    {
        editedName = value;
        OnPropertyChanged("EditedName");
    }
}

private int selectedIndex;
public int SelectedIndex
{
    get { return selectedIndex; }
    set
    {
        selectedIndex = value;
        OnPropertyChanged("SelectedIndex");
    }
}
TextBoxe
s和
ListBox
添加到视图中并应用绑定。这是棘手的部分。因为,当您从
列表视图
中选择项目时,所选项目的索引必须存储在SelectedIndex属性中,所选联系人姓名应绑定到用于编辑值的
文本框

<ListBox  Name="contactNames" SelectedIndex="{Binding SelectedIndex}" ItemsSource="{Binding ContactNames}" SelectedItem="{Binding EditedName}" />
<TextBox Name="addNameTextBox" Text="{Binding ContactName}" />
<TextBox Name="editNameTextBox" Text="{Binding EditedName}" />
别忘了将您的列表创建为一个可观察的集合
。否则,
LisView
将不会被通知对列表所做的更改


希望这能有所帮助。

您使用的是
可观察收集吗?除非我不明白,否则我相信这会解决你的问题。我使用列表,但我也可以使用ObservableCollection。这会有什么帮助?是的,并且在ViewModel上更改了InotifyProperty。这应该可以让你开始了。新元素可以添加到listView1中并首先选择添加的项目吗?Rhyous我愿意接受任何想法,现在我只有一个想法就是使用指针,但我认为其他一切都更好,所以请写信告诉我你有什么:)@John Kalberer我用这个,我在收藏中添加了一个项目,这一点已经很清楚了。我想要的是一个添加和编辑的方法,谢谢:)。我也需要一些时间,因为我现在有点忙1。属性如何获取列表中当前选定的项,您将如何绑定到该项?举几行为例,我会很感激的!:)@John您可以在ViewModel中创建一个SelectedItem属性并将ListBox.SelectedItem绑定到它。这对你有用吗?否则,我对此也有点陌生,但我相信您可以在ViewModel中创建CollectionView,并将ListBox绑定到它,而不是使用默认视图。然后,您可以进行排序、筛选等操作,以及(从集合视图)获取当前索引。直接绑定到集合时,将自动为您创建默认视图。
if (EditedName != null && EditedName != string.Empty)
{                
    ContactNames[SelectedIndex] = EditedName;
    EditedName = string.Empty;
}
else if (ContactName!=null && ContactName != string.Empty)
{
    ContactNames.Add(ContactName);
    ContactName = string.Empty;
}