【问题标题】:Access the Window's DataContext from a DataTemplate in a DataGrid从 DataGrid 中的 DataTemplate 访问 Windows DataContext
【发布时间】:2016-01-19 01:46:22
【问题描述】:

我在我的 WPF 应用程序中使用 DataGrid。它确实具有选定行的行详细信息。因此我设置了 RowDetailsTemplate。在这个 DataTemplate 中,我想访问我的 Window 的 DataContext。例如,我的 RowDetailsTemplate 中有一个标签,我想将它的内容属性绑定到我的 viewModel 的属性,该属性位于窗口的 DataContext 中。我如何做到这一点。

感谢您的帮助!

【问题讨论】:

    标签: c# wpf mvvm datagrid


    【解决方案1】:

    查看基于 RelativeSource 的绑定的这种用法,例如 {Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}。这是一个例子:

    1. Xaml:

          <DataGrid ItemsSource="{Binding Strings}" AutoGenerateColumns="False" >
          <DataGrid.Columns>
              <DataGridTemplateColumn Header="String" Width="SizeToCells" IsReadOnly="True">
                  <DataGridTemplateColumn.CellTemplate>
                      <DataTemplate DataType="{x:Type soDataGridHeplAttempt:ClicableItemsModel}">
                          <ListBox HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding ClickableItems}">
                              <ListBox.ItemsPanel>
                                  <ItemsPanelTemplate>
                                      <StackPanel Orientation="Horizontal"></StackPanel>
                                  </ItemsPanelTemplate>
                              </ListBox.ItemsPanel>
                              <ListBox.ItemContainerStyle>
                                  <Style TargetType="ListBoxItem">
                                      <Setter Property="ContentTemplate">
                                          <Setter.Value>
                                              <DataTemplate>
                                                  <Button  Width="70" Content="{Binding }" Style="{StaticResource ButtonInCellStyle}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
                                                           Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext.Command}" 
                                                           CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=Content}"/>
                                              </DataTemplate>
                                          </Setter.Value>
                                      </Setter>
                                  </Style>
                              </ListBox.ItemContainerStyle>
                          </ListBox>
                      </DataTemplate>
                  </DataGridTemplateColumn.CellTemplate>
              </DataGridTemplateColumn>
          </DataGrid.Columns>
      </DataGrid>
      
    2. 查看模型:

      private ICommand _command;
      public ObservableCollection<ClicableItemsModel> Strings { get; set; }
      
      public ICommand Command
      {
          get { return _command ?? (_command = new RelayCommand<object>(MethodOnCommmand)); }
      }
      
      private void MethodOnCommmand(object obj)
      {
      
      }
      
    3. 模型 pu 这个在模型类里面:

         public ObservableCollection<String> ClickableItems { get; set; }
      

    问候,

    【讨论】:

    • 该死的。好吧,我确实知道绑定到相对源,并且我也尝试过,但我忘了写 Path=DataContext.MyProperty。我刚刚写了 Path=MyProperty。我的错。无论如何,非常感谢你的帮助。这个问题我快疯了。
    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 2012-06-29
    • 2010-10-12
    相关资源
    最近更新 更多