给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.Width
是DataGridLength
类型,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
的绑定,您可以将其删除。
给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.Width
是DataGridLength
类型,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
的绑定,您可以将其删除。