2015-02-06 2 views
1

WPF MVVM 패턴 응용 프로그램에 DataGrid가 있고 헤더에서 콤보 상자를 사용하여 모눈을 필터링하려고합니다. 모든 코드가 Window 클래스 (MVVM 아님)에있을 때이 작업을 수행 할 수 있지만 내 자신을 위해서 VM에 바인딩하여 동일한 결과를 얻으려고합니다.DataGrid의 ComboBox 머리글에 대한 바인딩

<DataGridTextColumn x:Name="transNameColumn" Binding="{Binding TransName}" Width="325"> 
<DataGridTextColumn.Header> 
    <ComboBox ItemsSource="{Binding oTran}" DisplayMemberPath="TransName" SelectedValuePath="UID" 
      HorizontalAlignment="Left" Width="315"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="SelectionChanged"> 
       <i:InvokeCommandAction Command="{Binding Transmittal_ComboSelect}"/> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </ComboBox> 
</DataGridTextColumn.Header> 

데이터 격자가있는 문제는이 같은 모습을있는 (바인딩은 바로 위) :

<DataGridTextColumn x:Name="transNameColumn" Binding="{Binding TransName}" Width="325"> 
<DataGridTextColumn.Header> 
    <ComboBox ItemsSource="{Binding oTran}" DisplayMemberPath="TransName" SelectedValuePath="UID" 
      HorizontalAlignment="Left" Width="315"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="SelectionChanged"> 
       <i:InvokeCommandAction Command="{Binding Transmittal_ComboSelect}"/> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </ComboBox> 
</DataGridTextColumn.Header> 

과 최고 수준의 그리드 여기에 XAML의 따라서 결합 됨 :

<Grid DataContext="{Binding}"> 

콤보 상자가 DataGrid 안에 있기 때문에 바인딩이 엉망이된다고 생각합니다. 콤보 박스를 자체 XAML과 함께 사용하면 잘 동작합니다. 그러나 헤더로 삽입 할 때 채워지지 않습니다 (그리고 이벤트 바인딩도 작동하지 않을 것이라고 생각합니다. 그러나 채워지지 않으므로 확인할 수 없으므로 선택할 방법이 없습니다).

답변

2

바인딩에 RelativeSource를 사용해야합니다. 결국 다음과 같이 보일 것입니다 :

"{Binding DataContext.oTran, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}" 
+0

감사합니다. 이전 단계에서 해당 행을 제거했다고 생각합니다 (비 MVVM에서 MVVM 버전으로 이식 할 때). 나는 천천히 DataContext가 무엇을하는지 이해하기 시작했다. –

1

켈리 제안에 추가. 콤보 상자 열 추가에 대한 전체 코드를 참조하십시오.

<Grid> 
    <DataGrid AutoGenerateColumns="False" Name="dgr" ItemsSource="{Binding GridItems}" > 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Name}" > 
       <DataGridTextColumn.Header> 
        <StackPanel Orientation="Horizontal">       
         <TextBlock Text="combo" Grid.Row="0"/> 
         <ComboBox Grid.Row="1" Width="70" HorizontalAlignment="Center" Name="cboBhp" 
              ItemsSource="{Binding Path=DataContext.ComboItems, 
              RelativeSource={RelativeSource AncestorType={x:Type Window}}}" 
            SelectedValue="{Binding Path=DataContext.ComboValue, RelativeSource={RelativeSource AncestorType={x:Type Window}}, 
          Mode=TwoWay}"> 
         </ComboBox> 
        </StackPanel> 
       </DataGridTextColumn.Header> 
      </DataGridTextColumn> 

     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 
public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
     this.DataContext = new MainViewModel(); 
    } 
} 
public class GridSample 
{ 
    public string Name { get; set; } 

} 


public class MainViewModel:INotifyPropertyChanged 
{ 
    private string comboValue; 
    public string ComboValue 
    { 
     get { return comboValue; } 
     set 
     { 
      if (comboValue != value) 
      { 
       comboValue = value; 
       NotifyPropertyChanged("ComboValue"); 
      } 
     } 
    } 
    public MainViewModel() 
    { 

     ComboItems = new ObservableCollection<string>(); 
     ComboItems.Add("pascal"); 
     ComboItems.Add("Braye"); 

     ComboValue = "pascal"; 

     GridItems = new ObservableCollection<GridSample>() { 
     new GridSample() { Name = "Jim"} ,new GridSample() { Name = "Adam"} }; 

    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(string str) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(str)); 
     } 
    } 

    public ObservableCollection<GridSample> GridItems { get; set; } 

    public ObservableCollection<string> ComboItems { get; set; } 
} 
+0

코드의 훌륭한 세부 사항을 보내 주셔서 감사합니다. . . 결국 모든 일이 올바르게 끝나더라도 다른 접근법과 스타일을 보는 것이 좋습니다. 그리고 또 다른 예제를 볼 때 내 생각에 또 다른 실수를하는 것이 드문 일입니다. –