Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建两列对齐的WPF组合框(第一列自动宽度)?_C#_Wpf_Combobox - Fatal编程技术网

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>