2016-09-12 4 views
0

DataGrid에 Link가 포함 된 열이 있습니다. 파일 내가 내 자료 뷰 모델 클래스에이 코드를 사용하고자하는이 방법을C# : Cast to Base

public void LinkClicked(object sender, RoutedEventArgs e) 
{ 
    var vm = (BasePartViewModel<Part>) DataContext; 
    vm.OpenFile(); 
} 

를 사용

<DataGridHyperlinkColumn Binding="{Binding Path=Number}" > 
    <DataGridHyperlinkColumn.ElementStyle> 
     <Style> 
      <EventSetter Event="Hyperlink.Click" Handler="LinkClicked"/> 
     </Style> 
    </DataGridHyperlinkColumn.ElementStyle> 
</DataGridHyperlinkColumn> 

클릭

에 오픈됩니다.

는 그러나 문제는이 캐스트가 있기 때문에 실제로 다른 모든 구현에

(BasePartViewModel<Part>) DataContext 

작동하지 않는다는 것입니다. 예를 들어

(BasePartViewModel<Plug>) DataContext 

PlugPart에서 유래. 파생 된 모든 ViewModel에서이 메서드를 구현하지 않고 작업을 수행하는 방법은 무엇입니까?

+0

이벤트 처리기 코드가 xaml 파일의 코드 숨김 뒤에 있습니까? –

+1

올바르게 이해한다면 캐스팅에만 문제가 있습니다. BasePartViewModel <>이 공변 (covariant)인지 확인하고 그렇지 않은 경우 확인하십시오. – CrudaLilium

+0

@EyalPerry : 예, 그렇습니다. –

답변

1

와 데이터 그리드 셀에 명령 패턴을 적용하는 방법에 대한 예제가있다.

interface MyInterface<out T> 
{ 
    void OpenFile(); 
} 

class Plug : Part 
{ } 


class Part 
{ } 

class BasePartViewModel<T> : MyInterface<T> 
{ 
    public void OpenFile() 
    { 
     throw new NotImplementedException(); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     BasePartViewModel<Plug> derived = new BasePartViewModel<Plug>(); 
     MyInterface<Part> b = derived; 
     b.OpenFile(); 
    } 
} 
1

문제의 해결 방법은 간단합니다.
곧, 세미 MVVM 구현을 만들었습니다.
전체 MVVM을 사용하면 코드를 배울 필요가없고 캐스팅 할 필요가 없습니다.

이벤트 핸들러에 대한 MVVM의 응답은 명령 패턴입니다.
(많은 기사가 WWW에 있습니다.)

명령 패턴을 구현하는 가장 간단한 방법은 재사용 가능한 명령 클래스를 사용하는 것입니다.
This should get you started - 이미 MVVM 프레임 워크를 사용하고 있지 않는 한.
이들은 대개 고유 한 구현 세트와 함께 제공됩니다. 당신이 명령 패턴이 무엇인지 이해하면

모든 소개 -
당신의 ViewModel이보기는 공공과 공공 재산으로 노출되는 예상 명령 속성이
간 바인딩 중을 확인하기 만하면됩니다 얻는 사람.
xaml.cs 파일에 코드가 있어야하며 캐스팅을하지 않아도됩니다.

당신이 공변 인터페이스에 OpenFile 방법을 고려하고 해당 인터페이스로 캐스팅 할 수있는 하이퍼 링크 here

관련 문제