2012-11-02 3 views
0

목록 및 목록보기에서 문제가 발생합니다. ListView의 itemsSource 속성은 내 클래스의 목록 (목록)에 바인딩됩니다.MVVM 디자인 문제

기존 항목을 수정하고 새 항목을 목록에 추가하려고합니다. 이러한 이유 때문에 Contact (name, surname, ...) 클래스의 각 요소에 대한 텍스트 상자를 만들었습니다.

Now 선택한 항목을 수정하려면 각 텍스트 상자의 Text 속성을 this :

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

새 요소를 만들고 싶습니다. 나는 이것을해야만한다 :

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

여기서 tempContact는 최근 버튼을 통해 목록에 추가되는 Contact 클래스의 인스턴스이다.

문제이 목록의 요소를 추가 및 수정하고 싶습니다. 아이디어가 필요합니다. 누구든지 내게 손을 줄 수 있니?

+0

ObservableCollection을 사용하고 있습니까? 내가 이해하지 못한다면 나는 그것이 당신의 문제를 해결할 것이라고 믿습니다. –

+0

List를 사용하지만 ObservableCollection을 사용할 수도 있습니다. 어떻게 도움이 될까요? –

+0

예, ViewModel에'INotifyPropertyChanged'가 있습니다. 그게 너를 가야 해. –

답변

1

-

  • 바인딩을 현재 선택한 항목을 새로운 객체를 반환하여 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에 목록의 변경 사항에 대한 알림이 표시되지 않습니다.

    희망이 도움이됩니다.

  • +0

    나는 컬렉션에 아이템을 추가 할 때 이것을 거의 설명했다. 내가 요구하는 것은 모두 추가 및 편집하는 방법입니다. –

    +0

    언젠가는 내 대답을 업데이트 할 예정입니다. –

    +0

    ok, 내일 확인하고 의견을 드리겠습니다.) –

    1

    현재 편집 된 개체 인 속성을 ViewModel에 추가합니다. 그런 다음, ViewModel에서 목록에 추가 할 명령을 작성하십시오. 예 : NewObjectCommand. 이 명령에서는 현재 "새 항목"을 편집 중이던 상태 (부울)를 토글하여 새 객체를 만듭니다. EditingObject 속성은 새 객체를 추가하지 않고 추가중인 경우 편집중인 새 항목을 반환하는 경우 목록에서 현재 선택된 객체를 반환합니다.

    상태가 변경되고 EditedObject 속성의 논리 값이 변경 될 수 있으면 업데이트 할 바인딩의 INotifiyPropertyChanged 인터페이스에서 PropertyChanged 이벤트를 발생시켜야합니다. ViewModel의 EditedObject 속성에 개체를 편집하려면 컨트롤이 포함 된보기를 바인딩하고 ListBox가 ViewModel의 목록에 바인딩되고 ViewModel이 목록에서 현재 선택된 개체를 추적 할 수 있는지 확인해야합니다.

    어떤 트리거 메커니즘으로 개체가 목록에 추가되는지 파악해야합니다. 개체를 추가 한 후 선택한 항목으로 다시 상태를 변경해야합니다. 당신은 아마 약간의 유효성 검사 논리뿐만 아니라와 IDataErrorInfo 또는 일부 등

    길고도 짧은 이야기해야합니다 : 당신의 ViewModel

  • 속성으로 EditedObject을 노출에

    • 는 상태 변수 만들기를; 하나가 추가되는 경우가에서 문자열 유형의 속성을 작성, TextBox에서 목록에 항목을 추가하려면 목록에서 다른, 그
  • +0

    1. 목록에서 현재 선택된 항목을 가져 오는 방법은 무엇입니까? 어떻게 바인딩합니까? 몇 줄을 예로 들자면 감사하겠습니다! :) –

    +0

    @ 존 당신은 ViewModel에 SelectedItem 속성을 만들고 ListBox.SelectedItem을 바인딩 할 수 있습니다. 그게 너에게 효과가 있니? 그렇지 않으면, 나는 이것에 대해 아주 처음이지만, 당신은 ViewModel에 CollectionView를 생성하고 ListBox를 기본 뷰를 사용하는 대신 바인딩 할 수 있다고 생각한다. 그런 다음 정렬, 필터링 등을 수행 할 수있을뿐만 아니라 (콜렉션 뷰에서) 현재 색인을 가져올 수 있습니다. 컬렉션에 직접 바인딩하면 기본보기가 자동으로 만들어집니다. – Alan