2011-08-01 79 views
1

我的問題是與此類似;C#/ WPF - 數據網格 - 綁定TextBox的寬度在RowDetails到含數據網格的

除了我想排的細節從來沒有超過它跨越列的寬度。

|--0--|--1--|--2--|--3--|--4--| 
|---------Row-Details---------| 

我試圖AreRowDetailsFrozen這一點也沒有影響。我也嘗試綁定到父Grid的實際寬度(OneWay),但這會導致寬度超過我的兩個屏幕。

這是我目前的嘗試(簡化);

<Grid> 
    <DataGrid x:Name="Grid" 
       Grid.Row="1" 
       ItemsSource="{Binding Collection}" 
       IsReadOnly="True" 
       AutoGenerateColumns="False" 
       ColumnWidth="Auto" 
       CanUserResizeColumns="False" 
       CanUserResizeRows="False" 
       RowDetailsVisibilityMode="VisibleWhenSelected" 
       AreRowDetailsFrozen="True" 
       SelectionUnit="FullRow" 
       VerticalAlignment="Top" 
       HorizontalAlignment="Center"> 
     <DataGrid.RowDetailsTemplate> 
      <!-- Begin row details section. --> 
      <DataTemplate> 
       <TextBox DataContext="{Binding ErrorMessage}" 
         IsReadOnly="True" 
         Margin="5" 
         BorderBrush="Transparent" 
         ScrollViewer.VerticalScrollBarVisibility="Auto" 
         ScrollViewer.CanContentScroll="True" 
         TextWrapping="Wrap" 
         Text="{Binding .}"> 
       </TextBox> 
      </DataTemplate> 
     </DataGrid.RowDetailsTemplate> 
    </DataGrid> 
    </Grid> 

這將導致以下結果:

|--0--|--1--|--2--|--3--|--4--| 
|---------Row-Details are as wide as the longest row in their content ---------| 

綁定文本框的寬度任何父容器(網格,數據網格,ItemsPresenter):

Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}}, Path=ActualWidth, Mode=OneWay}" 

結果:

       |------Viewable Area-------| 
|---- Columns ----| 
|---------Row-Details --------------------------------------------------------------| 

這是非常令人沮喪,我只是想行詳細信息不要更改DataGrid的寬度,是不是要問這麼多? :)

回答

1

做到這一點的唯一方法是改變DataGridRow控件模板。在那裏,我們可以將行詳細信息主機寬度(DataGridDetailsPresenter)綁定到單元格的寬度。例如:

<Style x:Key="{x:Type dg:DataGridRow}" TargetType="{x:Type dg:DataGridRow}"> 
    <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" /> 
    <Setter Property="SnapsToDevicePixels" Value="true"/> 
    <Setter Property="Validation.ErrorTemplate" Value="{x:Null}" /> 
    <Setter Property="ValidationErrorTemplate"> 
     <Setter.Value> 
     <ControlTemplate> 
      <TextBlock Margin="2,0,0,0" VerticalAlignment="Center" Foreground="Red" Text="!" /> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Template"> 
     <Setter.Value> 
     <ControlTemplate TargetType="{x:Type dg:DataGridRow}"> 
      <Border x:Name="DGR_Border" 
        Background="{TemplateBinding Background}" 
        BorderBrush="{TemplateBinding BorderBrush}" 
        BorderThickness="{TemplateBinding BorderThickness}" 
        SnapsToDevicePixels="True"> 
      <dgp:SelectiveScrollingGrid> 
       <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="*"/> 
       </Grid.ColumnDefinitions> 

       <Grid.RowDefinitions> 
       <RowDefinition Height="*"/> 
       <RowDefinition Height="Auto"/> 
       </Grid.RowDefinitions> 

       <dgp:DataGridCellsPresenter x:Name="cellPresenter" Grid.Column="1" 
             ItemsPanel="{TemplateBinding ItemsPanel}" 
             SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 

       <dgp:DataGridDetailsPresenter dgp:SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding RelativeSource={RelativeSource AncestorType={x:Type dg:DataGrid}}, Path=AreRowDetailsFrozen, Converter={x:Static dg:DataGrid.RowDetailsScrollingConverter}, ConverterParameter={x:Static dg:SelectiveScrollingOrientation.Vertical}}" 
              Grid.Column="1" Grid.Row="1" 
              Visibility="{TemplateBinding DetailsVisibility}" Width="{Binding ElementName=cellsPresenter, Path=ActualWidth}"/> 

       <dgp:DataGridRowHeader dgp:SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical" Grid.RowSpan="2" 
            Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dg:DataGrid}}, Path=HeadersVisibility, Converter={x:Static dg:DataGrid.HeadersVisibilityConverter}, ConverterParameter={x:Static dg:DataGridHeadersVisibility.Row}}"/> 
      </dgp:SelectiveScrollingGrid> 
      </Border> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    </Style> 

希望這會有所幫助。

+0

謝謝,我會等待很短的時間,看看是否有一個更簡潔的方法,但是這是迄今爲止我見過的唯一可行的選擇。非常感激。 – CityView

0

我這裏DataGrid RowDetails Width problem

回答類似的問題的答案在這裏感覺就像一個解決辦法,所以我做了一些研究,也 發現在Telerik的論壇解決方案,因爲我們使用他們的 RadGridView。原來這個解決方案也適用於DataGrid。

關鍵是將ScrollViewer.Horizo​​ntalScrollBarVisibility 屬性設置爲Disabled,請參閱下面的示例。

<DataGrid ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 
<DataGrid.RowDetailsTemplate> 
    <DataTemplate> 
     <Border> 
      <TextBlock Foreground="White" Text="{Binding RowDetails}" 
         TextWrapping="Wrap"/> 
     </Border> 
    </DataTemplate> 
</DataGrid.RowDetailsTemplate> </DataGrid> 
0

我找到了另一種方式來解決這個問題:

private void GridOnLoadingRowDetails(object sender, DataGridRowDetailsEventArgs e) 
{ 
    var dataGridColumnHeadersPresenter = FindVisualChild<DataGridColumnHeadersPresenter>((DataGrid)sender); 
    e.DetailsElement.SetBinding(WidthProperty, new Binding("ActualWidth") { Source = dataGridColumnHeadersPresenter }); 
} 

這可以防止您使用恆定的值(例如「6」) - 這將不適合,如果有人設置DataGrid.RowHeaderWidth - 和轉換器。

我已將此添加到DataGrid.LoadingRowDetails事件處理程序,因爲我已經調整以其他方式RowDetails。此