Привязка свойства зависимости не обновляется - PullRequest
2 голосов
/ 31 октября 2011

Я определил свойство зависимости следующим образом:

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.

Затем я привязал столбец сетки в моем интерфейсе к этому свойству ...

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

Насколько я понимаю, поскольку ширина столбца связана с этим свойством, всякий раз, когда я обновляю свойство, ширина столбца также должна обновляться.

Что я делаю неправильно, так как ширина не обновляется при изменении свойства? Я также пытаюсь обновить его с помощью анимации, которая также не работает. Кроме того, точка останова, установленная в получателе свойства AnimateColumnWidth, никогда не достигается, что означает, что ничто никогда не пыталось получить свойство.

(Это работало так ясно, что я где-то сломал !!)

Сноска:

Преобразованное значение определяется в корневом пространстве имен моего приложения (я думаю, что 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 ]

5 голосов
/ 31 октября 2011

Вы регистрируете свойство как "AnimateColumnWidthProperty", что является "неправильным", произвольное имя только поля, вы, вероятно, хотите "AnimateColumnWidth" (или вы, конечно, измените привязку, но, как есть, она не срабатывает, так как путь указывает незарегистрированной собственности).

Возможно, вы захотите прочитать что-нибудь и при отладке привязок , затем вы сможете обнаружить такие ошибки, так как они будут сообщены механизмом привязки. (что-то вроде «свойство x не найдено в объекте y»).

Также использование точек останова в методах получения или установки ничего вам не говорит, механизм привязки не использует их, они просто для вашего удобства.

1 голос
/ 31 октября 2011

Одна вещь, которую я не сделал, - это установил datacontext сетки, столбец которого я хотел бы обозначить как "this".

public MainWindow()
{
    InitializeComponent();
    ProductsArea.DataContext = this;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...