2010-01-27 5 views
0

Command가 내 ViewModel에 바인딩 된 여러 MenuItem이 있습니다. 오늘까지는 모두 제대로 실행됩니다.동적으로로드 된 플러그인의 함수에 대한 데이터 바인딩

이제 ItemsSource가 ObservableCollection에 바인딩 된 MenuItem을 추가했습니다. 이 MenuItem의 요점은 모든 플러그인의 이름이 나타나도록 플러그인 목록을 열거하는 것입니다. 그런 다음 사용자가 플러그인 이름을 클릭하면 오디오 필터의 속성을 표시하는 함수를 호출해야합니다. 내 현재의 구현, 작동하지 않습니다에서

는,이 같은 데이터 바인딩을 시도 :

<MenuItem Header="Filters" ItemsSource="{Binding FilterPluginNames}"> 
    <MenuItem.ItemContainerStyle> 
     <Style> 
      <Setter Property="MenuItem.Command" Value="{Binding ShowFilterDialogCommand}" /> 
     </Style> 
    </MenuItem.ItemContainerStyle> 
</MenuItem> 
문제는 내가이의 MenuItem의 DataContext에 같은 문자열을 사용하려고하기 때문에 BindingExpression 경로 오류가 있다는 것입니다

.

이렇게하면 MenuItem의 MenuItems에 대한 DataContext가 ItemsSource의 개체 유형으로 자동 설정됩니다. 사실입니까?

DataContext를 변경해야한다면 다른 모든 명령을 처리하는 ViewModel로 변경하고 싶습니다. 그러나 만약 그렇게한다면, 세상에서 어떻게 필터 속성을 표시 할 플러그인을 말할 수 있습니까? 최소한 CommandParameter를 전달해야하지만이 값을 필터 이름에 바인딩하는 것이 가장 선호하는 옵션은 아닙니다. 이 작업을 수행 할 수있는 다른 방법이 있습니까?

실제로 DataContext가 ObservableCollection의 개체 유형으로 자동 설정되는 경우 인터페이스 메서드 ShowFilterProperties()를 직접 호출하는 것이 좋습니다. 나는 명령 바인딩없이 이것을 할 수 없다고 확신한다. 그렇다면이 응용 프로그램을 어떻게 다룰 수 있습니까? 모든 플러그인이 명령 처리기를 노출하게 만들면 대화 상자가 표시됩니까?

편집는 - 내가 ObservableCollection에 유형을 변경하려면 코드를 수정하고, 확실히 충분히, WPF 내가 하나의 옵션은 플러그인이 ICommand의 노출하는 것입니다 추측 그래서 T 형식에 데이터 바인딩하고 싶어하지만 난 돈 ' 이것이 이상한 접근인지 아닌지 아는가?

수정 - 오케이, 방금 새로운 것을 배웠습니다. 인터페이스는 필드를 가질 수 없기 때문에 플러그인으로 databind 할 수 있습니까?

+0

필드를 가질 수는 없지만 속성은 ;-) 가질 수 있습니다. 또한 플러그인은 실제로 잘 정의 된 용어가 아닙니다. 플러그 인이 중요하다고 생각한다면 플러그인으로 무엇을 의미하는지 설명 할 수 있습니까? 팁을 주신 덕분에 –

답변

1

당신이 생각하는 것처럼 꽤 구속력이 없을 것 같습니다. 바인딩에 진단을 넣고 바인딩 대상을 확인하는 것이 좋습니다. 아마 조금을 디버깅 할 필요가 ...

<Window … 
    xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase" 
    /> 

    <TextBlock Text="{Binding Path=Caption, diagnostics:PresentationTraceSources.TraceLevel=High}" … /> 

나는 당신의 접근 방식이 올바른지 생각 : 여기

http://www.beacosta.com/blog/?p=52

샘플 것 : 여기 디버깅 바인딩에 대한 좋은 링크입니다.

+0

! 바인딩 디버깅 팁에 대한 링크를 확인하겠습니다. 나는 그 지역에서 항상 몇 가지 트릭을 사용할 수 있습니다. :) – Dave