【问题标题】:Dependency Property binding not being updated未更新依赖属性绑定
【发布时间】:2011-12-18 09:26:21
【问题描述】:

我已经定义了一个依赖属性如下:

public static readonly DependencyProperty AnimateColumnWidthProperty =
    DependencyProperty.Register("AnimateColumnWidthProperty", typeof(double), typeof(MainWindow), new PropertyMetadata(0.0));

public double AnimateColumnWidth
{
    get { return (double)GetValue(AnimateColumnWidthProperty); }
    set { SetValue(AnimateColumnWidthProperty, value); }
}

当我的应用程序启动时,我会这样做......

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    AnimateColumnWidth = Properties.Settings.Default.ProductInfoWidthExpanded;
}

...应该将值初始化为其起始值 - 在本例中为 400。

然后,我将 UI 中的一列网格绑定到此属性...

<ColumnDefinition 
    Name="ProductInfo" 
    Width="{Binding Path=AnimateColumnWidth,
                    Converter={StaticResource doubleToGridLength},
                    Mode=TwoWay}" />

据我了解,由于列宽绑定到此属性,所以每当我更新该属性时,列宽也应该更新。

当我更改属性时宽度没有更新,我做错了什么?我也试图通过一个也不起作用的动画来更新它。此外,在 AnimateColumnWidth 属性的 getter 上设置的断点永远不会被命中 - 这意味着从未尝试检索该属性。

(这确实有效,我在某个地方弄坏了一些东西!)

脚注:

转换的值是在我的应用程序的根命名空间中定义的(我相信如果 WPF 找不到它会抱怨)。

[ValueConversion(typeof(Double), typeof(GridLength))]
public class DoubleToGridLength : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return new GridLength((double)value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return ((GridLength)value).Value;
    }
}

【问题讨论】:

    标签: c# .net wpf xaml dependency-properties


    【解决方案1】:

    您将属性注册为"AnimateColumnWidthProperty",这是“错误的”,只有字段名称是任意的,您可能想要"AnimateColumnWidth"(或者您当然更改了绑定,但是由于路径指向它,所以它失败了到未注册的财产)。

    您可能还想阅读有关调试bindings 的内容,然后您可以发现绑定引擎将报告的此类错误。 (类似于“在对象 y 上找不到属性 x”)。

    此外,在 getter 或 setter 中使用断点不会告诉您任何事情,绑定引擎使用它们,它们只是为了您自己的方便。

    【讨论】:

    • 绑定提示成功了。网格的数据上下文尚未设置。
    【解决方案2】:

    我没有做的一件事是将我想要影响的列的网格的数据上下文设置为“this”。

    public MainWindow()
    {
        InitializeComponent();
        ProductsArea.DataContext = this;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多