给datagridtextcloumn的宽度绑定double属性,宽度只增不减

Bind double property to the width of datagridtextcloumn, the width only increases but does not decrease

给datagridtextcloumn的宽度绑定double,宽度只增不减。为什么会这样?谁能帮我改一下密码?

MainWindow.xaml:

<Window.Resources>
        <local:ViewModel x:Key="vm"/>
        <local:MyMultiValueConverter x:Key="MyMultiValueConverter"/>
    </Window.Resources>
    <StackPanel DataContext="{StaticResource vm}">
        <DataGrid Name="dg" ItemsSource="{Binding View}" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Col1"  Binding="{Binding SomeString}"  MinWidth="30" MaxWidth="300"  >
                    <DataGridTextColumn.Width>
                        <MultiBinding Converter="{StaticResource MyMultiValueConverter}">
                            <Binding Path="WidthValue" Source="{StaticResource vm}"/>
                            <Binding Path="WidthDefault" Source="{StaticResource vm}"/>
                        </MultiBinding>
                    </DataGridTextColumn.Width>
                    <DataGridTextColumn.ElementStyle>
                        <Style TargetType="{x:Type TextBlock}">
                            <Setter Property="TextAlignment" Value="Center"/>
                            <Setter Property="Width">
                                <Setter.Value>
                                    <MultiBinding Converter="{StaticResource MyMultiValueConverter}">
                                        <Binding Path="WidthValue" Source="{StaticResource vm}"/>
                                        <Binding Path="WidthDefault" Source="{StaticResource vm}"/>
                                    </MultiBinding>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </DataGridTextColumn.ElementStyle>
                </DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>
        <CheckBox IsChecked="{Binding WidthDefault}" Content="Default Width"/>
        <Slider Width="200" Height="20" Minimum="5"  Maximum="300" Value="{Binding WidthValue}"/>
        <!--<TextBox Text="{Binding WidthValue}"/>-->
    </StackPanel>

代码隐藏:

public class ViewModel : INotifyPropertyChanged
  {
    public ViewModel()
    {
      ObservableCollection<Data> col = new ObservableCollection<Data>();
       col.Add(new Data() { SomeString = 44 });
       col.Add(new Data() { SomeString = 84 });
       col.Add(new Data() { SomeString = 104 });
      cvs.Source = col;
    }
    private CollectionViewSource cvs = new CollectionViewSource();
    public ICollectionView View { get => cvs.View; }

    private double _widthValue = 30;
    public double WidthValue
    {
      get => this._widthValue;
      set { this._widthValue = value; OnPorpertyChanged(); }
    }

    private bool _widthDefault = false;
    public bool WidthDefault
    {
      get => this._widthDefault;
      set { this._widthDefault = value; OnPorpertyChanged(); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    internal void OnPorpertyChanged([CallerMemberName] string propName = "") => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));

  }

  public class Data
  {
    public double SomeString { get; set; }
  }

  public class MyMultiValueConverter : IMultiValueConverter
  {
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
      double w =30;
      if (!(bool)values[1]) double.TryParse(values[0].ToString(), out w);
      return w;
    }
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
      throw new NotImplementedException();
    }
  }

滑动Slider增加WidthValue时,DataGridTextColumn的Width增加:

滑动Slider减小WidthValue时,DataGridTextColumn的Width没有减小:

您遇到此问题是因为 DataGridTextColumn.Width 的绑定不起作用。

原因是DataGridTextColumn.WidthDataGridLength类型,TextBlock.Width是[=15=类型] 并且绑定在这里有效。

因此,当您增加 TextBlock 的宽度时,列的宽度会自动增加,但列的宽度不会随着 TextBlock.Width 的变化而缩小。

您可以做的是更改 return multyvalueconverter 的值:

public class MyMultiValueConverter : IMultiValueConverter
{
   public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
   {
     double w =30;
     if (!(bool)values[1]) double.TryParse(values[0].ToString(), out w);
     return new DataGridLength(w);
   }
   public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
   {
     throw new NotImplementedException();
   }
}

然后您不需要 TextBlock.Width 的绑定,您可以将其删除。