依赖项属性绑定未更新

时间:2011-10-30 22:09:07

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

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

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;
    }
}

2 个答案:

答案 0 :(得分:5)

您将该属性注册为"AnimateColumnWidthProperty",这是“错误的”,只有字段名称是任意的,您可能需要"AnimateColumnWidth"(或者您更改绑定当然,但是原样,它失败了因为路径指向未注册的属性。)

您可能还想阅读有关调试bindings的内容,然后您可以发现这些错误,因为它们将由绑定引擎报告。 (例如“在对象y上找不到属性x”)。

在getter或setter中使用断点并没有告诉你任何事情,绑定引擎使用它们,它们只是为了你自己的方便。

答案 1 :(得分:1)

我没做过的一件事就是将我希望影响的网格的datacontext设置为“this”。

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