C# 如何创建两列对齐的WPF组合框(第一列自动宽度)?
转这个 ] 进入这个 详细说明: 我可以用这个讨厌的黑客(聚合所需的最大列宽):C# 如何创建两列对齐的WPF组合框(第一列自动宽度)?,c#,wpf,combobox,C#,Wpf,Combobox,转这个 ] 进入这个 详细说明: 我可以用这个讨厌的黑客(聚合所需的最大列宽): //result.Type==typeof(列表) _returnTypeColumnWidth=result.Max(信息=>新格式化文本(信息.ReturnType.Name,文化信息.CurrentCulture,WindowsFlowDirection.LeftToRight,新字体(FontFamily,FontStyle,FontWeight,FontStretch),FontSize,MediaBr
//result.Type==typeof(列表)
_returnTypeColumnWidth=result.Max(信息=>新格式化文本(信息.ReturnType.Name,文化信息.CurrentCulture,WindowsFlowDirection.LeftToRight,新字体(FontFamily,FontStyle,FontWeight,FontStretch),FontSize,MediaBrush.Black)。宽度);
并将第一个控件(在ComboBox.ItemTemplate中)的宽度绑定到它
问题是:如何使用MVVM实现它
我的想法是从父级属性中获取MinWidth(该属性将随宽度更改而更新):
C#:
公共双返回类型ColumnWidth
{
获取{return\u returnTypeColumnWidth;}
设置
{
if(Double.IsNaN(值)|(value您可以使用附加属性和,让不同的网格
s在它们之间共享列或行自动调整大小。这正是您想要做的,但其他人已经编写了代码。如果您必须自己编写,我建议您使用类似于此的附加属性来执行此操作——或者如果您处于一个re环境中al Harry,甚至可能在后面的代码中混淆了它。正如Will在评论中所指出的,这个逻辑完全属于视图。viewmodel知道或关心的显示列宽越少越好
<ComboBox
...
Grid.IsSharedSizeScope="True"
...
>
<ComboBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition
Width="Auto"
Grid.SharedSizeGroup="ReturnTypeNameColumn"
/>
<ColumnDefinition
Width="*"
/>
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
Margin="0,0,4,0"
TextAlignment="Right"
Text="{Binding ReturnType.Name}"
/>
<TextBlock
Grid.Column="1"
Text="{Binding Path=., Converter={StaticResource MethodInfoNameConverter}}"
/>
</Grid>
</DataTemplate>
<ComboBox.ItemTemplate>
</ComboBox>
您可能必须设置ItemsPanel
并将其放在用于项目主机的StackPanel
上,但请先尝试一下,看看它是如何运行的。而不是StackPanel
使用定义了两列的Grid
。MVVM!=无代码隐藏。这意味着代码隐藏中没有业务逻辑。UI逻辑属于那里。
<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>
public double ReturnTypeColumnWidth
{
get { return _returnTypeColumnWidth; }
set
{
if(Double.IsNaN(value) || (value <= _returnTypeColumnWidth))
return;
_returnTypeColumnWidth = value;
RaisePropertyChanged("ReturnTypeColumnWidth");
}
}
<ComboBox
...
Grid.IsSharedSizeScope="True"
...
>
<ComboBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition
Width="Auto"
Grid.SharedSizeGroup="ReturnTypeNameColumn"
/>
<ColumnDefinition
Width="*"
/>
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
Margin="0,0,4,0"
TextAlignment="Right"
Text="{Binding ReturnType.Name}"
/>
<TextBlock
Grid.Column="1"
Text="{Binding Path=., Converter={StaticResource MethodInfoNameConverter}}"
/>
</Grid>
</DataTemplate>
<ComboBox.ItemTemplate>
</ComboBox>