0

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

我想修改现有项目并将新项目添加到列表中。出于这个原因,我为 Contact(name, surname, ...) 类中的每个元素制作了文本框

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

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

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

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

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

问题是我想同时添加和修改这个列表的元素,我需要一个想法。谁能帮我一把?

4

2 回答 2

1

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

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

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

长话短说:

  • 在 ViewModel 中创建状态变量
  • 将 EditedObject 公开为属性;如果正在添加一个对象,则返回新对象,否则返回列表中当前选定的项目
  • 绑定到那个
于 2012-11-02T16:21:48.557 回答
1

要将项目添加到列表中TextBox,请在您的中创建一个字符串类型的属性,ViewModel并在属性更改时通知。您还必须为编辑创建一个类似的属性,并且还必须从ListView

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");
    }
}

TextBoxes 和添加ListBox到您的视图并应用绑定。这是棘手的部分。因为,当您从 中选择一个项目时ListView,所选项目的索引必须存储在 SelectedIndex 属性中,所选联系人姓名应绑定到TextBox用于编辑值的联系人。

<ListBox  Name="contactNames" SelectedIndex="{Binding SelectedIndex}" ItemsSource="{Binding ContactNames}" SelectedItem="{Binding EditedName}" />
<TextBox Name="addNameTextBox" Text="{Binding ContactName}" />
<TextBox Name="editNameTextBox" Text="{Binding EditedName}" />

在处理按钮单击的 Command 方法中,添加逻辑以根据属性集添加或编辑项目。

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;
}

不要忘记将您的列表创建为ObservableCollection. 否则,LisView将不会通知对列表所做的更改。

希望这可以帮助。

于 2012-11-02T16:25:33.017 回答