2012-07-20 12 views
5

Ho il seguente Expander definito per un DataGrid.Intestazione dell'espansione griglia: non è possibile ordinare correttamente

<Expander IsExpanded="True" HorizontalAlignment="Stretch" Background="Blue"> 
    <Expander.Header> 
      <Grid HorizontalAlignment="Stretch" Background="BurlyWood"> 
         <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="3*" /> 
         <ColumnDefinition Width="*" /> 
         </Grid.ColumnDefinitions> 

         <TextBlock Text="{Binding Path=Name, StringFormat=\{0:D\}}" FontWeight="Bold" /> 
         <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Grid.Column="1"> 
         <TextBlock Text="Total : "/> 
         <TextBlock Text="{Binding Path=Items, Converter={StaticResource sumConverter}}" FontWeight="Bold"/> 
         </StackPanel> 
       </Grid> 
     </Expander.Header> 
     <ItemsPresenter /> 
</Expander> 

ho bisogno di visualizzare il nome della voce nella sinistra e la somma alla fine destro dell'intestazione di gruppo. Tuttavia ciò che ottengo è questo:

enter image description here

Come posso spostare il 'Total' all'estremità destra della testata?

+0

strano, ma funziona per me. Potrebbe esserci qualche altro codice che infrange la tua logica? – Artiom

risposta

5

Ho avuto lo stesso problema e se mi ricordo bene il problema è che la ContentPresenter per Expander.Header non si cura la HorizontalAlignment di Expander. Ho trovato da qualche parte questa soluzione:

<Expander.Header> 
    <Grid HorizontalAlignment="{Binding Path=HorizontalAlignment, RelativeSource={RelativeSource AncestorType={x:Type ContentPresenter}}, Mode=OneWayToSource}"> 
     ... 
    </Grid> 
</Expander.Header> 
+0

Funziona! Funziona! Grazie. – nakiya

0

Prova questa

<Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto" /> 
        <ColumnDefinition Width="*" /> 
        <ColumnDefinition Width="Auto" /> 
         <ColumnDefinition Width="5" /> //space between two textblocks 
        <ColumnDefinition Width="Auto" /> 
        </Grid.ColumnDefinitions> 

        <TextBlock Text="{Binding Path=Name, StringFormat=\{0:D\}}" FontWeight="Bold" /> 
        <TextBlock Text="Total : " Grid.Column="2"/> 
        <TextBlock Text="{Binding Path=Items, Converter={StaticResource sumConverter}}" FontWeight="Bold" Grid.Column="4"/> 

      </Grid> 

Spero che questo vi aiuterà

+0

ancora la stessa cosa. – nakiya

0

è possibile ottenere il risultato desiderato utilizzando un ValueConverter per impostare la larghezza della griglia nella Expander.Header per un valore relativo al Expander.ActualWidth, in questo modo:

<Expander Name="MyExpander" IsExpanded="True" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" Background="Blue"> 
     <Expander.Header> 
      <Grid HorizontalAlignment="Stretch" Background="BurlyWood" Width="{Binding ElementName=MyExpander, Path=ActualWidth, Converter={MyConverters:ExpanderHeaderWidthConverter}, ConverterParameter=30}"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto" /> 
        <ColumnDefinition Width="*" /> 
        <ColumnDefinition Width="Auto" /> 
       </Grid.ColumnDefinitions> 

       <TextBlock Text="{Binding Path=Name, StringFormat=\{0:D\}}" FontWeight="Bold" /> 
       <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Grid.Column="2"> 
        <TextBlock Text="Total : "/> 
        <TextBlock Text="{Binding Path=Items, Converter={StaticResource sumConverter}}" FontWeight="Bold"/> 
       </StackPanel> 
      </Grid> 
     </Expander.Header> 
     <ItemsPresenter /> 
    </Expander> 

Codice in materia di ValueConverter:

public abstract class BaseConverter : MarkupExtension 
{ 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return this; 
    } 
} 

public class ExpanderHeaderWidthConverter : BaseConverter, IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     // The actuacl Width of the Expander 
     double width = (double)value; 

     // Default width difference 
     double diff = 25.0; 

     if (parameter != null) 
     { 
      // If the parameter is not null, try to use it as width difference 
      Double.TryParse(parameter.ToString(), out diff); 
     } 

     // If width - diff is less than 0, return double.NaN instead. 
     if (width - diff < 0) 
     { 
      return double.NaN; 
     } 

     // Return the modified width 
     return width - diff; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     double width = (double)value; 
     double diff = 25.0; 
     if (parameter != null) 
     { 
      Double.TryParse(parameter.ToString(), out diff); 
     } 
     return width + diff; 
    } 
} 

provare a cambiare la ConverterParameter fino ad ottenere il risultato desiderato.

Problemi correlati