2012-11-02 113 views
0

我的問題是使用列表和列表視圖進行操作。 Listview的itemsSource屬性綁定到我的類中的列表(比如List)。MVVM設計問題

我想既修改現有項目,又添加新項目到列表中。由於這個原因,我爲類中的每個元素都創建了文本框Contact(name,surname,...)

現在如果我想修改所選項目,我將每個文本框的Text屬性設置爲這個:

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

如果我想創建新的元素。我必須這樣做:

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

其中tempContact是通過一個按鈕最近添加到列表中的聯繫人類的一個實例。

問題是我想同時添加和修改這個列表的元素,我需要一個想法。任何人都可以幫我一把嗎?

+0

你使用'ObservableCollection'嗎?除非我不明白我相信這會解決你的問題。 –

+0

我使用一個列表,但我也可以使用ObservableCollection。這將如何幫助? –

+0

是的,和ViewModel上的'INotifyPropertyChanged'。這應該讓你去。 –

回答

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

添加TextBoxe S和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將不會收到有關列表更改的通知。

希望這會有所幫助。

+0

我非常詳細地描述了在集合中添加項目。我要求的是一種方法來添加和編輯 –

+0

我會更新我的答案在某個時候 –

+0

好吧,將明天檢查並給予反饋,+1現在fow :) –

1

我將添加到您的ViewModel屬性是當前編輯的對象。然後,在你的ViewModel中創建一個命令添加到列表中。例如,NewObjectCommand。在這個命令中,你可以切換當前編輯一個「新項目」的狀態(也許是一個布爾值),創建新的對象。如果您未添加新對象並且在添加時返回正在編輯的新項目,則您的EditedObject屬性將返回列表中當前選定的對象。

當狀態發生變化並且EditedObject屬性的邏輯值可以更改時,您需要在INotifiyPropertyChanged接口上引發PropertyChanged事件以更新綁定。您應該將包含控件的View綁定到ViewModel的EditedObject屬性,並確保ListBox綁定到ViewModel的列表,並且ViewModel可以跟蹤列表中當前選定的對象。

你必須弄清楚什麼觸發機制導致對象被添加到列表中,然後你必須在添加它之後將狀態改回到所選項目。你可能需要一些驗證邏輯以及與IDataErrorInfo的或一些這樣的

長話短說:

  • 在你的視圖模型
  • 揭露EditedObject爲屬性創建一個狀態變量;它返回新的對象,如果被添加一個,否則當前所選的項目列表中的
  • 綁定到
+0

1.屬性如何獲取列表中當前選定的項目,您將如何綁定到該項目?以幾行爲例,我將不勝感激! :) –

+0

@John你可以在ViewModel中創建一個SelectedItem屬性並將ListBox.SelectedItem綁定到它。那對你有用嗎?否則,我也是一個新手,但我相信你可以在你的ViewModel中創建一個CollectionView,並讓你的ListBox綁定到它而不是使用默認視圖。然後你可以做排序,過濾等,以及獲取當前索引(從集合視圖)。當您直接綁定到集合時,會自動爲您創建一個默認視圖。 – Alan