Schalten Sie dieseWie erstellt man WPF ComboBox mit zwei ausgerichteten Spalten (und automatische Breite für die erste)?
] 1
In diese
Ausführliche Beschreibung:
konnte ich es mit diesem fiesen Hack tun (Aggregieren max Spaltenbreite erforderlich) :
// result.Type == typeof(List<MethodInfo>)
_returnTypeColumnWidth = result.Max(info => new FormattedText(info.ReturnType.Name, CultureInfo.CurrentCulture, WindowsFlowDirection.LeftToRight, new Typeface(FontFamily, FontStyle, FontWeight, FontStretch), FontSize, MediaBrushes.Black).Width);
und bindende erste Kontrolle (in einer ComboBox.ItemTemplate) Breite dazu.
Die Frage ist: Wie geht es mit MVVM?
war meine Idee MinWidth von einem Eltern Eigentum zu erhalten (die mit Breite Änderungen aktualisiert werden):
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock
Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type sd:InvokeMethodDesigner}}, Path=ReturnTypeColumnWidth, Mode=OneWayToSource}"
MinWidth="{Binding RelativeSource={RelativeSource AncestorType={x:Type sd:InvokeMethodDesigner}}, Path=ReturnTypeColumnWidth, Mode=OneWay}"
Margin="0,0,4,0"
TextAlignment="Right" Text="{Binding ReturnType.Name}" />
<TextBlock Text="{Binding Path=., Converter={StaticResource MethodInfoNameConverter}}" />
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
C#:
public double ReturnTypeColumnWidth
{
get { return _returnTypeColumnWidth; }
set
{
if(Double.IsNaN(value) || (value <= _returnTypeColumnWidth))
return;
_returnTypeColumnWidth = value;
RaisePropertyChanged("ReturnTypeColumnWidth");
}
}
Aber die ReturnTypeColumnWidth_set() wird nur einmal aufgerufen, während der TextBlock-Initialisierung (Wert ist NaN).
Anstelle von 'StackPanel' verwenden Sie' Grid' mit definierten 2 Spalten. – XAMlMAX
MVVM! = Kein Codebehind. Es bedeutet keine Geschäftslogik im Codebehind. UI-Logik gehört dort. – Will