【发布时间】:2018-11-14 17:56:17
【问题描述】:
我需要使不同网格中的列相互依赖地移动。我找到了一个很好的解决方案:
<Grid.ColumnDefinitions>
<ColumnDefinition
Width="{Binding Source={x:Static properties:Settings.Default}, Path=GridColumnWidth,
Converter={StaticResource ColumnWidthConverter}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
MinWidth="50"></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="*" MinWidth="50"></ColumnDefinition>
</Grid.ColumnDefinitions>
- 并实现转换器:
public class ColumnWidthConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is string str && !str.Equals("*"))
return new GridLength(double.Parse(str));
return new GridLength(1, GridUnitType.Star);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is GridLength gridLength)
return gridLength.Value.ToString(CultureInfo.InvariantCulture);
return "*";
}
}
现在我需要在 CodeBehind 中做同样的事情。我这样做:
ColumnDefinition propertyNameColumnDefinition = new ColumnDefinition();
propertyNameColumnDefinition.MinWidth = 50;
BindingOperations.SetBinding(propertyNameColumnDefinition, WidthProperty, CreateBindingForColumnWidth());
ColumnDefinition gridSplitterColumnDefinition = new ColumnDefinition() { Width = GridLength.Auto };
ColumnDefinition propertyValueColumnDefinition = new ColumnDefinition();
propertyValueColumnDefinition.MinWidth = 50;
grid.RowDefinitions.Add(headerRowDefinition);
grid.ColumnDefinitions.Add(propertyNameColumnDefinition);
grid.ColumnDefinitions.Add(gridSplitterColumnDefinition);
grid.ColumnDefinitions.Add(propertyValueColumnDefinition);
.......
private Binding CreateBindingForColumnWidth()
{
Binding b = new Binding
{
Source = mpESKD.Properties.Settings.Default,
Path = new PropertyPath("GridColumnWidth"),
Mode = BindingMode.TwoWay,
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
Converter = new ColumnWidthConverter()
};
return b;
}
在这种情况下,没有任何效果。 我做错了什么?
【问题讨论】:
-
请检查使用了哪个
WidthProperty。试试ColumnDefinition.WidthProperty。见similar case -
转换器方法是否被触发,如果是,它接收哪个值?
-
阿什,谢谢!出色的观察和正确的假设