2011-08-16 7 views
0

내가 할 수있는 한 최선을 다해 설명해 보겠습니다.ViewModel의 속성 및 컬렉션 항목의 속성에 ViewModel의 속성을 바인딩하려면 어떻게해야합니까?

저는보기, 모델 및 발표자를 이해하려고 노력 중이므로 약간의 기능을 설명하는 작은 프로그램을 만들었습니다. . 내 작은 응용 프로그램은 기본적으로 앨범을 저장합니다. 앨범은 콤보 상자에 나열되며 모든 텍스트 상자 인 아티스트, 장르 및 연도 필드가 있습니다. 지금까지는 아무런 문제가 없었습니다 ... 저는 바인딩 소스를 만들고 뷰 모델 (제목, 아티스트, 장르 및 연도에 대한 속성을 가짐)에 바인딩했으며 예상대로 작동합니다. 콤보 상자를 순환 할 수 있으며 콤보 상자 선택에 따라 다양한 텍스트 상자가 변경됩니다.

그런 다음 각 앨범에 노래 목록을 추가하기로 결정 했으므로보기 모델에 새로운 노래 속성을 추가하고보기에 데이터 표보기를 추가했습니다. 이것은 내가 꽤 혼란스럽게 된 곳입니다. 데이터 격자보기에 다른 모든 것에 사용 된 바인딩 소스를 바인드하면 분명히보기 모델의 직접 필드를 렌더링하기 만하면됩니다. 기본적으로 그리드 형식으로 텍스트 상자에 표시하는 것을 반복합니다.

문제를 충분히 설명했다고 가정하면 텍스트 상자의 앨범 필드와 데이터 그리드보기의 노래를 표시하려면 어떻게해야합니까? 나는 두 번째 바인딩 소스가 필요하다는 결론에 도달했다고 생각하지만 가능한 경우이를 피하고 싶습니다. 필자는 데이터 그리드 뷰의 DataMember 속성을 "Songs"(뷰 모델의 노래 컬렉션 속성 이름)로 전달하는 것과 같은 뻔한 일을 시도했습니다.

누구나 올바른 방향으로 나를 가리킬 수 있습니까?

답변

0

따라서 ViewModel은 앨범을 나타내는 모델을로드하고 읽습니다. View는 ViewModel을 감시하고 이해할 수있는 방식으로 사용자에게 앨범을 제공합니다.

먼저 모델을 살펴 보겠습니다. 하나 이상의 노래가있는 앨범이 있습니다.

public sealed class Album 
{ 
    public string Name {get;set;} 
    public string Artist {get;set;} 
    public IEnumerable<Song> Songs {get;set;} 
} 

public sealed class Song 
{ 
    public string Name {get;set;} 
    public TimeSpan Length {get;set;} 
} 

뷰 모델로드까지 모든 앨범

public sealed class ViewModel : INotifyPropertyChanged 
{ 
    public ObservableCollection<Album> Albums {get;set;} 
    public Album SelectedAlbum {get;set;} // implement INPC for this property 
} 

뷰 모델은보기의 DataContext에이다의 공개 모음입니다. 컨트롤은 앨범 및 SelectedAlbum에 바인딩합니다. ViewModel이 SelectedAlbum에 대해 작동 할 필요가 없다면 View에서 현재 선택된 앨범을 모두 처리 할 수 ​​있습니다. 이것은 단지 예일뿐입니다. 예상보다

<ComboBox 
    ItemsSource="{Binding Albums}" 
    SelectedItem="{Binding SelectedAlbum}" /> 

귀하의 컨트롤이

<TextBlock Text="{Binding SelectedAlbum.Name}" /> 

귀하의 데이터 그리드가 SelectedAlbum

<DataGrid ItemsSource="{Binding SelectedAlbum.Songs}" /> 

그리고 모두의 노래 속성에 바인딩에 대한 정보를 표시하기 위해 SelectedAlbum에 상대적으로 결합이 더 갔다 .

+0

답장을 보내 주셔서 감사합니다. 저는 WinForms를 사용하고 있습니다. 그러나이 예제는 여러분과 Charles의 대답을 결합한 후에 구현할 수있을 정도로 분명합니다. –

0

저는 항상 DataSource로 설정된 첫 번째 BindingSource가있는 두 번째 BindingSource를 사용하여이 작업을 수행했습니다.

+0

두 번째 바인딩 소스를 생성하고 소스 데이터 소스로 첫 바인딩 소스를 만들었습니다. 그런 다음 새 바인딩 소스를 데이터 표보기에 바인딩했습니다 ... 아무 것도 변경되지 않았습니다. 원래 바인딩 소스에서 사용 가능한 속성을 반복하는 것입니다. –

+0

@Brent는 Song 컬렉션을 두 번째 BindingSource의 DataMember로 설정 했습니까? –

+0

처음부터 이렇게하려고 시도했습니다. 렌더링 할 노래 속성을 지정합니다. 디스플레이 멤버 설명을 기반으로, 확실히 내가 원하는 것처럼 들립니다. 두 번째 바인딩 원본과 데이터 표보기에서 (두 번째 바인딩 원본이 바인딩 된 후) 문제가있는 경우에만 Visual Studio의 표시 멤버 속성에서 사용할 수있는 것이 없습니다. 수동으로 입력 할 수 있지만 아무 것도 발생하지 않습니다. 속성 자체의 이름이 "Songs"이므로 표시 멤버 값에 "노래"를 입력 할 수 있다고 가정합니다.) –

관련 문제