2013-07-22 3 views
1

모두 나는 사용자 정의 DataGridViewDataGidViewOnItemsSourceChanged 이벤트를 재정의합니다. 이 이벤트에서 관련 ViewModel의 데이터 세트에 대한 참조를 가져와야합니다. 코드는 내가 ResourceDataViewModel resourceDataViewModel에 대한 참조를 얻는 방법을 알고 싶어 표시된 줄에ViewModel에 대한 참조를 얻는 방법

public class ResourceDataGrid : DataGrid 
{ 
    protected override void OnItemsSourceChanged(
     System.Collections.IEnumerable oldValue, 
     System.Collections.IEnumerable newValue) 
    { 
     if (Equals(newValue, oldValue)) 
      return; 
     base.OnItemsSourceChanged(oldValue, newValue); 

     ResourceCore.ResourceManager manager = ResourceCore.ResourceManager.Instance(); 
     ResourceDataViewModel resourceDataViewModel = ?? // How do I get my ResourceDataViewModel 
     List<string> l = manger.GetDataFor(resourceDataViewModel); 
     ... 
    } 
} 

입니다. 공명은 내가 각 탭에 데이터 그리드 및 ascociated ViewModel을 포함하는 여러 개의 탭이 있는데, ViewModel은 [ResourceManager]을 통해 검색해야하는 데이터를 보유하고 있습니다 (또는 더 좋은 방법이 있습니까?).

위의 이벤트에서 질문은, 어떻게 내가 ascociated 얻을 수 ResourceDataViewModel?

감사합니다.

+2

'this.DataContext를 ResourceDataViewModel'로 사용할 수 없습니까? 덧글에 대해 – McGarnagle

+2

+1. 나는'DataContext'에서 바로 캐스팅 할 수 있다는 것을 깨달았습니다. 바로 바보입니다. 대단히 고마워요. 귀찮아 질 수 있다면 대답 일 수 있습니다. 시간 내 줘서 고마워. – MoonKnight

답변

2

DataContext을 얻고 뷰 모델 유형으로 캐스트 : 당신은 자신이 ususally WPF의 UI 요소를 서브 클래스 발견하면 더 나은 방법이 있는지 물어

var viewModel = this.DataContext as ResourceDataViewModel 
1

응용 프로그램에 정적 참조를 넣습니다. VM을 만들 때 참조를 정적에 배치하고 필요에 따라 액세스합니다.

+0

표준 접근 방식입니까? MVVM과 계속해서 전투하기가 어렵습니다. 그것은 내 첫 번째 대규모 MVVM이며 그것은 나를 죽이고있다! 답장을 보내 주셔서 감사합니다 ... – MoonKnight

+1

예, 저는 2 Silverlight Project에서이 작업을 수행했으며 Windows Phone 8의 appstore에 최근 게시했습니다. – OmegaMan

1

... 내 경험에 입니다.

전체 탭 컨트롤을 뷰 모델에 바인딩함으로써 비즈니스 로직 (그리드에 표시 할 데이터 선택)을 벗어날 수 있습니다.

설명하려면 여기에 아주 간단한 예가 있습니다. 이 탭 컨트롤 호스팅 윈도우에 대한 내 XAML입니다 : 내 윈도우의 데이터 컨텍스트가

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <TabControl ItemsSource="{Binding Tabs}" SelectedItem="{Binding SelectedTab}"> 
      <TabControl.ItemContainerStyle> 
       <Style TargetType="TabItem"> 
        <Setter Property="Header" Value="{Binding TabName}"></Setter> 
       </Style> 
      </TabControl.ItemContainerStyle> 
      <TabControl.ContentTemplate> 
       <DataTemplate> 
        <Grid> 
         <DataGrid ItemsSource="{Binding TabData}"></DataGrid> 
        </Grid> 
       </DataTemplate> 
      </TabControl.ContentTemplate> 
     </TabControl> 
    </Grid> 
</Window> 

TabsViewModel (I는 PRISM NuGet 패키지에서 찾을 수 있습니다 NotificationObject을 사용하고 있습니다) :

public class TabsViewModel: NotificationObject 
{ 
    public TabsViewModel() 
    { 
     Tabs = new[] 
      { 
       new TabViewModel("TAB1", "Data 1 Tab 1", "Data 2 Tab1"), 
       new TabViewModel("TAB2", "Data 1 Tab 2", "Data 2 Tab2"), 
      }; 
    } 

    private TabViewModel _selectedTab; 
    public TabViewModel SelectedTab 
    { 
     get { return _selectedTab; } 
     set 
     { 
      if (Equals(value, _selectedTab)) return; 
      _selectedTab = value; 
      RaisePropertyChanged(() => SelectedTab); 
     } 
    } 

    public IEnumerable<TabViewModel> Tabs { get; set; } 
} 

public class TabViewModel 
{ 
    public TabViewModel(string tabName, params string[] data) 
    { 
     TabName = tabName; 
     TabData = data.Select(d => new RowData(){Property1 = d}).ToArray(); 
    } 
    public string TabName { get; set; } 
    public RowData[] TabData { get; set; } 
} 

public class RowData 
{ 
    public string Property1 { get; set; } 
} 

이것은 분명히 지나치게 단순화 된 경우이지만 각 탭에 표시 할 데이터에 대한 비즈니스 로직이있는 경우 코드 숨김과는 달리 뷰 모델 중 하나에 상주 할 수 있습니다. 이것은 당신에게 MVVM이 격려하도록 고안된 모든 '관심의 분리'이점을 제공합니다 ...

+0

답변을 주셔서 감사합니다 ... – MoonKnight

관련 문제