0

私の問題は、リストとリストビューを操作することです。Listview の itemsSource プロパティは、私のクラス (List など) のリストにバインドされています。

既存のアイテムを変更し、新しいアイテムをリストに追加したい。このため、クラス 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イベントを発生させる必要があります。オブジェクトを編集するためのコントロールを含むビューを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");
    }
}

TextBoxeとをビューに追加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 に答える