2015-02-06 63 views
1

我在WPF MVVM模式應用程序中有一個DataGrid,我試圖在標題中使用組合框來過濾網格。當所有代碼都在Window類(而不是MVVM)中時,我可以做到這一點,但爲了我自己的緣故,我試圖將它綁定到VM以獲得相同的結果。這裏的XAML: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> 

和頂級網格因此被約束:

<Grid DataContext="{Binding}"> 

我在想,因爲組合框在數據網格內,綁定會搞砸。當我有自己的組合框時,使用相同的XAML,它可以正常工作。但是,當作爲標題插入它不會填充(我認爲事件綁定也將無法正常工作,但無法驗證,因爲它不會填充,因此無法進行選擇)。

回答

2

您需要在綁定中使用RelativeSource。它最終會看起來像這樣:

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

謝謝,我會再補充一點。我認爲在之前的步驟中我已經刪除了該行(從非MVVM移植到MVVM版本時)。我慢慢開始明白DataContext正在做什麼。 – 2015-02-06 19:14:52

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

感謝代碼中的優秀細節。 。 。即使當我最終把所有的事情都設定好時,看到其他方法和風格總是很好的。當我看到另一個例子的時候,我並沒有看到另一個錯誤。 – 2015-02-06 19:17:52