【问题标题】:Binding to Properties not work in CodeBehind but work in xaml [duplicate]绑定到属性在 CodeBehind 中不起作用,但在 xaml 中起作用 [重复]
【发布时间】:2018-11-14 17:56:17
【问题描述】:

我需要使不同网格中的列相互依赖地移动。我找到了一个很好的解决方案:

  1. 在属性中创造价值
  2. 在 xamlI 中创建绑定:
 <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>
  1. 并实现转换器:
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
  • 转换器方法是否被触发,如果是,它接收哪个值?
  • 阿什,谢谢!出色的观察和正确的假设

标签: c# wpf xaml binding


【解决方案1】:

必须是:

BindingOperations.SetBinding(propertyNameColumnDefinition, ColumnDefinition.WidthProperty, CreateBindingForColumnWidth());

感谢 ASh 的评论

【讨论】:

    猜你喜欢
    • 2015-01-03
    • 1970-01-01
    • 2012-02-08
    • 2014-06-13
    • 1970-01-01
    • 2016-04-23
    • 2017-04-15
    • 2016-09-09
    • 1970-01-01
    相关资源
    最近更新 更多