2011-03-21 3 views
0

저는 WPF에 익숙하지 않고 코드 비딩 파일로 몇 가지 앱을 개발했으며 시작하기 전에 Schifflett의 'in the box'소개를 통해 MVVM을 읽었습니다 내 현재 응용 프로그램.다른 속성의 값을 기반으로 WPF 데이터 바인딩 변경하기

내가 사용하고있는 항목에는 일반적인 문자열 속성이 많이 포함되어 있으며 근무 시간을 근무 시간으로 매핑하는 시간이라는 Dictionary 속성이 있습니다.

내 사용자 인터페이스에는 ViewModel의 컬렉션에 바인딩 된 이러한 항목의 DataGrid보기와 사용자가 날짜를 선택할 수있는 콤보 상자 (ViewModel에서 SelectedDate에 바인딩 된 날짜)가 있습니다. DataGrid의 Hours 열에는 일주일의 근무 시간 수가 표시되어야합니다 (즉 item.Hours[SelectedDate] 또는 이와 비슷한 효과가 있어야 함).

가장 좋은 방법은 무엇입니까? {Binding Hours[SelectedDate]}과 같은 바인딩 표현식 내에 변수를 넣을 수 있습니까?

+0

나는 이해할 수 없다. 날짜 및 시간 모음을 가진 DataGrid가 있습니다. 그리고 날짜를 선택할 수있는 콤보 상자. 왜 둘 다 필요하니? –

답변

0

두 가지 솔루션이 있습니다 계산을 Setter 자체에 넣으십시오. SelectedDate가 설정 될 때마다 "Hours"에 대해 PropertyChanged를 발생 시키십시오.

이 Hours 계산이이 ViewModel의 View에서만 사용되는 경우이 방법을 사용합니다.

2) 날짜를 허용하는 값 ​​변환기를 만들고 계산 된 값을 반환합니다. 그런 다음되어 selectedDate 속성에 시간을 바인딩 : 계산은 여러 뷰에서 또는 여러 ViewModels에 필요한 경우

<TextBlock Text="{Binding SelectedDate, Converter={StaticResource DateToHoursConverter}}" 

나는이 방법을 사용합니다. 값 변환기는 이런 종류의 재사용에 적합합니다.

+0

가치 변환기는 제가 고백 한 솔루션입니다. 감사합니다! –

0

바인딩 할 속성에 인덱서가 있으면 바인딩 할 수 있습니다. 이 인덱서에 대해 적절한시기에 INotifyPropertyChanged를 발생시켜야합니다.

편집 : 바인딩 표현식 내의 변수는 작동하지 않지만 시간에 바인딩하고 변환기와 SelectedDate를 convertparameter로 사용하여 원하는 값을 얻을 수 있습니다. "SeletedDate"가 변경되면 "시간"에 대해 INotifyPropertyChanged를 발생시켜야합니다. 방법이 될 수 중 하나

public int Hours {get { return calculateHours(SelectedDate); } } 

"calculateHours"또는 수 :

1) 귀하되어 selectedDate 기반으로하는 시간 속성을 만듭니다 즉시 마음에 와서

관련 문제