C# 如何将两个控件的宽度之和绑定到另一个控件的最小宽度

C# 如何将两个控件的宽度之和绑定到另一个控件的最小宽度,c#,wpf,xaml,casting,multibinding,C#,Wpf,Xaml,Casting,Multibinding,我想设置网格列的MinWidth,它应该是一个标签的实际宽度和一个列单元格中另一个网格中的按钮控件的宽度之和。为此,我使用了一个转换器类,但了解了XAML部分。 转换器在这里: class StringSumtoIntConverter : IMultiValueConverter { public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture) {

我想设置网格列的MinWidth,它应该是一个标签的实际宽度和一个列单元格中另一个网格中的按钮控件的宽度之和。为此,我使用了一个转换器类,但了解了XAML部分。 转换器在这里:

class StringSumtoIntConverter : IMultiValueConverter
{
    public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture)
    {
        int sum = 0;
        foreach (var item in value)
        {
            sum += System.Convert.ToInt32(item);
        }

        return sum;
    }
    //...Other implementations
}
到目前为止,我编写的XAML代码是:

xmlns:helperClasses="clr-namespace:EmbroidaryManagementSystem_V2._0.HelperClasses" <!--Import class-->

<helperClasses:StringSumtoIntConverter x:Key="StringSumtoIntConvert"/>  <!--Inside Window.Resources tag-->

<ColumnDefinition Width="48*"> <!--Inside Grid-->
    <ColumnDefinition.MinWidth>
        <MultiBinding Converter="{StaticResource StringSumtoIntConvert}">
            <Binding Path=""></Binding>
        </MultiBinding>
    </ColumnDefinition.MinWidth>
</ColumnDefinition>
xmlns:helperClasses=“clr命名空间:EmbroidaryManagementSystem_V2.\u 0.helperClasses”
XAML的完整实现如下:

<Window x:Class="EmbroidaryManagementSystem_V2._0.View.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:EmbroidaryManagementSystem_V2._0.View"
    xmlns:y="clr-namespace:EmbroidaryManagementSystem_V2._0.ViewModel.CollectionsViewModel"
    xmlns:helperClasses="clr-namespace:EmbroidaryManagementSystem_V2._0.HelperClasses"
    mc:Ignorable="d"
    Title="MainWindow" Height="655.512" Width="1120.159" FontSize="24" WindowStartupLocation="CenterScreen"
    >
<Window.Resources>
    <helperClasses:StringSumtoIntConverter x:Key="StringSumtoIntConvert"/>
</Window.Resources>
<Window.DataContext>
    <y:ClientCollectionVM/>
</Window.DataContext>
<Grid HorizontalAlignment="Left" Height="622" VerticalAlignment="Top" Width="1110" Background="#FFD6DBE9">
    <Grid.RowDefinitions>
        <RowDefinition Height="89*"/>
        <RowDefinition Height="39*"/>
        <RowDefinition Height="494*"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="137*"/>
        <ColumnDefinition Width="48*">
            <ColumnDefinition.MinWidth>
                <MultiBinding Converter="{StaticResource StringSumtoIntConvert}">
                    <Binding Path=""></Binding>
                </MultiBinding>
            </ColumnDefinition.MinWidth>
        </ColumnDefinition>
    </Grid.ColumnDefinitions>
    <GridSplitter x:Name="gridSplitter" Grid.Column="1" HorizontalAlignment="Left" Height="533" Grid.Row="1" 
                  VerticalAlignment="Top" Width="2" Grid.RowSpan="2"/>
    <Grid Grid.Column="1" Height="35" Background="#FF657695" 
          Grid.Row="1" VerticalAlignment="Top">
        <Label x:Name="lblNotificationsHeader" Content="Notifications" HorizontalAlignment="Left" VerticalAlignment="Top" FontSize="14.667" Height="30" Foreground="#FFEBF0EE"/>
        <Button x:Name="btnNotificationsClose" Content="X" 
                Margin="0,5,8,0" VerticalAlignment="Top" Width="20" FontFamily="Verdana" HorizontalAlignment="Right" Background="Transparent" FontSize="13.333" Foreground="Black"/>
    </Grid>
</Grid>

还有一个错误,说明:无法将类型为“EmbroidaryManagementSystem”的对象转换为类型为“System.IConvertible”。 第行:

<MultiBinding Converter="{StaticResource StringSumtoIntConvert}">
                        <Binding Path=""></Binding>
                    </MultiBinding>


我不知道为什么。

您没有在绑定中指定任何内容,因此它将在您的数据上下文(即VM)中传递。VM不能转换为int。您需要传入{Binding ElementName=btnNotificationsClose,Path=ActualWidth},对于lblNotificationsHeader也是如此


老实说,听起来你把事情复杂化了。网格行/列的大小不可调整,除非您使用的拆分器不是拆分器。

您没有在绑定中指定任何内容,因此它将在数据上下文(即VM)中传递。VM不能转换为int。您需要传入{Binding ElementName=btnNotificationsClose,Path=ActualWidth},对于lblNotificationsHeader也是如此


老实说,听起来你把事情复杂化了。网格行/列的大小不可调整,除非您使用的拆分器不是拆分器。

您没有在绑定中指定任何内容,因此它将在数据上下文(即VM)中传递。VM不能转换为int。您需要传入{Binding ElementName=btnNotificationsClose,Path=ActualWidth},对于lblNotificationsHeader也是如此


老实说,听起来你把事情复杂化了。网格行/列的大小不可调整,除非您使用的拆分器不是拆分器。

您没有在绑定中指定任何内容,因此它将在数据上下文(即VM)中传递。VM不能转换为int。您需要传入{Binding ElementName=btnNotificationsClose,Path=ActualWidth},对于lblNotificationsHeader也是如此


老实说,听起来你把事情复杂化了。网格行/列的大小不可调整,除非您使用的拆分器不是拆分器。

您需要在多重绑定中向转换器提供值

<MultiBinding Converter="{StaticResource StringSumtoIntConvert}">
    <Binding ElementName="lblNotificationsHeader" Path="ActualWidth" />
    <Binding ElementName="btnNotificationsClose" Path="ActualWidth" />
</MultiBinding>
我们将把GridSplitter放在它自己的列中,将列宽度设置为
“2”
将第一列定义的宽度设置为
“4*”
,将第三列定义的宽度设置为
“*”
“4*”
实际上只是一个随机数,星号大小根据百分比计算,所以4并不总是有效的,在本例中就是这样

我们还需要向内部网格添加一些列,我们将为这些列命名,并使用这些元素获取多重绑定的宽度。我们这样做,而不是从元素本身获取宽度,因为实际宽度不包括边距

<Grid Background="#FFD6DBE9">
    <Grid.RowDefinitions>
        <RowDefinition Height="89*" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="494*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="4*" />
        <ColumnDefinition Width="2" />
        <ColumnDefinition Width="*">
            <ColumnDefinition.MinWidth>
                <MultiBinding Converter="{StaticResource StringSumtoIntConvert}">
                    <Binding ElementName="cdNotificationHeaderLabel" Path="ActualWidth" />
                    <Binding ElementName="cdNotificationHeaderButton" Path="ActualWidth" />
                </MultiBinding>
            </ColumnDefinition.MinWidth>
        </ColumnDefinition>
    </Grid.ColumnDefinitions>
    <GridSplitter x:Name="gridSplitter"
                  Grid.Row="1"
                  Grid.RowSpan="2"
                  Grid.Column="1"
                  Width="2"
                  ResizeBehavior="PreviousAndNext" />
    <Grid Grid.Row="1"
          Grid.Column="2"
          Height="35"
          Background="#FF657695">
        <Grid.ColumnDefinitions>
            <ColumnDefinition x:Name="cdNotificationHeaderLabel" Width="Auto" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition x:Name="cdNotificationHeaderButton" Width="Auto" />
        </Grid.ColumnDefinitions>
        <Label x:Name="lblNotificationsHeader"
               Margin="0 0 5 0"
               HorizontalAlignment="Left"
               VerticalAlignment="Center"
               Content="Notifications"
               FontSize="14.667"
               Foreground="#FFEBF0EE" />
        <Button x:Name="btnNotificationsClose"
                Grid.Column="2"
                HorizontalAlignment="Right"
                VerticalAlignment="Center"
                Background="Transparent"
                Content="X"
                FontFamily="Verdana"
                FontSize="13.333"
                Foreground="Black" />
    </Grid>
</Grid>


综上所述,我建议从GridSplitter派生一个自定义控件并以这种方式处理它,但上面的内容应该有助于您启动并运行。

您需要在多重绑定中向转换器提供值

<MultiBinding Converter="{StaticResource StringSumtoIntConvert}">
    <Binding ElementName="lblNotificationsHeader" Path="ActualWidth" />
    <Binding ElementName="btnNotificationsClose" Path="ActualWidth" />
</MultiBinding>
我们将把GridSplitter放在它自己的列中,将列宽度设置为
“2”
将第一列定义的宽度设置为
“4*”
,将第三列定义的宽度设置为
“*”
“4*”
实际上只是一个随机数,星号大小根据百分比计算,所以4并不总是有效的,在本例中就是这样

我们还需要向内部网格添加一些列,我们将为这些列命名,并使用这些元素获取多重绑定的宽度。我们这样做,而不是从元素本身获取宽度,因为实际宽度不包括边距

<Grid Background="#FFD6DBE9">
    <Grid.RowDefinitions>
        <RowDefinition Height="89*" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="494*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="4*" />
        <ColumnDefinition Width="2" />
        <ColumnDefinition Width="*">
            <ColumnDefinition.MinWidth>
                <MultiBinding Converter="{StaticResource StringSumtoIntConvert}">
                    <Binding ElementName="cdNotificationHeaderLabel" Path="ActualWidth" />
                    <Binding ElementName="cdNotificationHeaderButton" Path="ActualWidth" />
                </MultiBinding>
            </ColumnDefinition.MinWidth>
        </ColumnDefinition>
    </Grid.ColumnDefinitions>
    <GridSplitter x:Name="gridSplitter"
                  Grid.Row="1"
                  Grid.RowSpan="2"
                  Grid.Column="1"
                  Width="2"
                  ResizeBehavior="PreviousAndNext" />
    <Grid Grid.Row="1"
          Grid.Column="2"
          Height="35"
          Background="#FF657695">
        <Grid.ColumnDefinitions>
            <ColumnDefinition x:Name="cdNotificationHeaderLabel" Width="Auto" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition x:Name="cdNotificationHeaderButton" Width="Auto" />
        </Grid.ColumnDefinitions>
        <Label x:Name="lblNotificationsHeader"
               Margin="0 0 5 0"
               HorizontalAlignment="Left"
               VerticalAlignment="Center"
               Content="Notifications"
               FontSize="14.667"
               Foreground="#FFEBF0EE" />
        <Button x:Name="btnNotificationsClose"
                Grid.Column="2"
                HorizontalAlignment="Right"
                VerticalAlignment="Center"
                Background="Transparent"
                Content="X"
                FontFamily="Verdana"
                FontSize="13.333"
                Foreground="Black" />
    </Grid>
</Grid>


综上所述,我建议从GridSplitter派生一个自定义控件并以这种方式处理它,但上面的内容应该有助于您启动并运行。

您需要在多重绑定中向转换器提供值

<MultiBinding Converter="{StaticResource StringSumtoIntConvert}">
    <Binding ElementName="lblNotificationsHeader" Path="ActualWidth" />
    <Binding ElementName="btnNotificationsClose" Path="ActualWidth" />
</MultiBinding>
我们将把GridSplitter放在它自己的列中,将列宽度设置为
“2”
将第一列定义的宽度设置为
“4*”
,将第三列定义的宽度设置为
“*”
“4*”
实际上只是一个随机数,星号大小根据百分比计算,所以4并不总是有效的,在本例中就是这样

我们还需要向内部网格添加一些列,我们将为这些列命名,并使用这些元素获取多重绑定的宽度。我们这样做,而不是从元素本身获取宽度,因为实际宽度不包括边距

<Grid Background="#FFD6DBE9">
    <Grid.RowDefinitions>
        <RowDefinition Height="89*" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="494*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="4*" />
        <ColumnDefinition Width="2" />
        <ColumnDefinition Width="*">
            <ColumnDefinition.MinWidth>
                <MultiBinding Converter="{StaticResource StringSumtoIntConvert}">
                    <Binding ElementName="cdNotificationHeaderLabel" Path="ActualWidth" />
                    <Binding ElementName="cdNotificationHeaderButton" Path="ActualWidth" />
                </MultiBinding>
            </ColumnDefinition.MinWidth>
        </ColumnDefinition>
    </Grid.ColumnDefinitions>
    <GridSplitter x:Name="gridSplitter"
                  Grid.Row="1"
                  Grid.RowSpan="2"
                  Grid.Column="1"
                  Width="2"
                  ResizeBehavior="PreviousAndNext" />
    <Grid Grid.Row="1"
          Grid.Column="2"
          Height="35"
          Background="#FF657695">
        <Grid.ColumnDefinitions>
            <ColumnDefinition x:Name="cdNotificationHeaderLabel" Width="Auto" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition x:Name="cdNotificationHeaderButton" Width="Auto" />
        </Grid.ColumnDefinitions>
        <Label x:Name="lblNotificationsHeader"
               Margin="0 0 5 0"
               HorizontalAlignment="Left"
               VerticalAlignment="Center"
               Content="Notifications"
               FontSize="14.667"
               Foreground="#FFEBF0EE" />
        <Button x:Name="btnNotificationsClose"
                Grid.Column="2"
                HorizontalAlignment="Right"
                VerticalAlignment="Center"
                Background="Transparent"
                Content="X"
                FontFamily="Verdana"
                FontSize="13.333"
                Foreground="Black" />
    </Grid>
</Grid>

说了这么多,我会记下来的