【问题标题】:WPF converter on grid column and row length only works if gridsplitter is not used网格列和行长度上的 WPF 转换器仅在不使用 gridsplitter 时才有效
【发布时间】:2017-08-08 07:44:08
【问题描述】:

在 WPF 中,我有一个已绑定到列和行定义的布尔到长度转换器。

此转换器用于读取绑定的布尔值,以确定是否应隐藏或显示行/列。

这样做是为了让我可以“最大化”网格的给定部分或将其恢复为原始大小。只要我不使用 gridsplitter 来调整大小,它就可以工作。一旦发生这种情况,它就不再设置所需的长度。一旦使用了gridsplitter,我就有一种感觉,它会删除列定义上的绑定。有解决办法吗?

转换器

[ValueConversion(typeof(bool), typeof(GridLength))]
public class BoolToGridLengthConverter : IValueConverter
{
    public int Length { get; set; }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return ((bool)value == true) ? new GridLength(Length == 0 ? 1 : Length, GridUnitType.Star) : new GridLength(0);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {    // Don't need any convert back
        return null;
    }
}

XAML

<Grid>
    <Grid.Resources>
        <helpers:BoolToGridLengthConverter x:Key="BoolToGridLengthConverter1" Length="1" />
        <helpers:BoolToGridLengthConverter x:Key="BoolToGridLengthConverter2" Length="2" />
    </Grid.Resources>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="{Binding ShowColumn1, Mode=TwoWay, Converter={StaticResource BoolToGridLengthConverter1}}" />
        <ColumnDefinition Width="5" />
        <ColumnDefinition Width="{Binding ShowColumn2, Mode=TwoWay, Converter={StaticResource BoolToGridLengthConverter1}}" />
        <ColumnDefinition Width="5" />
        <ColumnDefinition Width="{Binding ShowColumn3, Mode=TwoWay, Converter={StaticResource BoolToGridLengthConverter1}}" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="{Binding ShowRow1, Mode=TwoWay, Converter={StaticResource BoolToGridLengthConverter1}}" />
        <RowDefinition Height="5" />
        <RowDefinition Height="{Binding ShowRow2, Mode=TwoWay, Converter={StaticResource BoolToGridLengthConverter2}}" />
    </Grid.RowDefinitions>
    <Grid Grid.Column="0" Grid.ColumnSpan="5" Grid.Row="0"></Grid>
    <GridSplitter Grid.Column="0" Grid.ColumnSpan="5" Grid.Row="1" ResizeDirection="Rows" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="5" />
    <Grid Grid.Column="0" Grid.Row="2"></Grid>
    <GridSplitter Grid.Column="1" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="5" />
    <Grid Grid.Column="2" Grid.Row="2"></Grid>
    <GridSplitter Grid.Column="3" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="5" />
    <Grid Grid.Column="4" Grid.Row="2"></Grid>
</Grid>

编辑:重组问题以包含更多 XAML

编辑:附加信息,当我希望扩展网格部分时,我将所有布尔值设置为 false,并将我想要的部分设置为 true。例如,如果我希望最大化 Grid.Column 2 和 Grid.Row 2,我将除 ShowColumn2 和 ShowRow2 之外的所有布尔值设置为 false。这可以按预期工作,并且当布尔值全部设置为 true 时,要恢复原始视图,它也可以按预期工作。问题是一旦我使用 gridsplitter 来调整列的大小,它就不能像以前那样工作了。当我最大化与以前相同的部分时,它可以正常工作,但是当我尝试将大小调整回原始大小时,Grid.Column 2 和 Grid.Row 2 占据了整个底行。除了它们之外的两列被最小化。

这让我相信,当使用 gridsplitter 时,转换器将不再能够将列的值设置为 true。

【问题讨论】:

  • 您可以尝试基于相同的布尔值在列的内容(网格、堆栈面板、数据网格等)中使用可见性转换器。这样你就不需要 GridLength 的转换器了。
  • 我尝试使用可见性转换器并没有调整其他列的大小,它只是使列内容消失。我在想gridsplitters造成了这个?我在同一视图中使用可见性转换器并按预期工作,但该网格中没有网格分割器。
  • @DavidLee,请包含视图的 xaml 标记。
  • @DavideLee,我用你的转换器做了一个小例子,它工作正常,请发布更多代码。
  • 我已更新我的问题以包含更多 xaml。如果您想查看我的 ShowColumn1 视图模型代码,请告诉我。它是相当标准的 mvvm 属性,继承自 INotifyPropertyChanged..

标签: c# wpf xaml wpfdatagrid gridsplitter


【解决方案1】:

在您的ColumnDefinition 中,您需要将MaxWidth 设置为零,以将RowColumnMaxHeight 设置为零。

尝试以下转换器:

[ValueConversion(typeof(bool), typeof(double))]
public class BoolToMaxConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return ((bool)value == true) ? double.MaxValue : 0d;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {    // Don't need any convert back
        return null;
    }
}

还有你的 xaml:

<Grid>
    <Grid.Resources>
        <local:BoolToMaxConverter x:Key="BoolToMaxConverter" />
    </Grid.Resources>
    <Grid.ColumnDefinitions>
        <ColumnDefinition MaxWidth="{Binding ShowColumn1, Converter={StaticResource BoolToMaxConverter}}"  />
        <ColumnDefinition Width="5" />
        <ColumnDefinition MaxWidth="{Binding ShowColumn2, Converter={StaticResource BoolToMaxConverter}}" />
        <ColumnDefinition Width="5" />
        <ColumnDefinition MaxWidth="{Binding ShowColumn3, Converter={StaticResource BoolToMaxConverter}}" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition MaxHeight="{Binding ShowRow1, Converter={StaticResource BoolToMaxConverter}}" />
        <RowDefinition Height="5" />
        <RowDefinition  MaxHeight="{Binding ShowRow2, Converter={StaticResource BoolToMaxConverter}}" />
    </Grid.RowDefinitions>
    <Grid Grid.Column="0" Grid.ColumnSpan="5" Grid.Row="0"></Grid>
    <GridSplitter Grid.Column="0" Grid.ColumnSpan="5" Grid.Row="1" ResizeDirection="Rows" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="5" />
    <Grid Grid.Column="0" Grid.Row="2"></Grid>
    <GridSplitter Grid.Column="1" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="5" />
    <Grid Grid.Column="2" Grid.Row="2"></Grid>
    <GridSplitter Grid.Column="3" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="5" />
    <Grid Grid.Column="4" Grid.Row="2"></Grid>
</Grid>

同时考虑删除TwoWay-Binding

【讨论】:

  • 工作就像一个魅力。我对将其标记为答案的延迟表示不好,因为我必须恢复旧版本来测试它。我完全改变了我的 UI 布局,因为我无法让它工作。
猜你喜欢
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 2023-03-19
相关资源
最近更新 更多