В WPF как обновить объект, с которым связано мое пользовательское свойство? - PullRequest
1 голос
/ 14 апреля 2010

У меня есть настраиваемое свойство, которое отлично работает, кроме случаев, когда оно связано с объектом.

Причина в том, что после выполнения следующего кода:

base.SetValue(ValueProperty, value);

... тогда мой контроль больше не связан . Я знаю это, потому что звоню:

base.GetBindingExpression(ValueProperty);

... отлично возвращает объект привязки - ДО Я вызываю base.SetValue. Поэтому мой вопрос: как передать новое «значение» объекту, с которым я связан?

РЕДАКТИРОВАТЬ: Вот код ...

public static readonly DependencyProperty ValueProperty =
    DependencyProperty.Register("Value", typeof(decimal?), typeof(NumericTextBox));

public decimal? Value
{
    get
    {
        return (decimal?)base.GetValue(ValueProperty);
    }
    set
    {
        base.SetValue(ValueProperty, value);
    }
}

Как видите, это простой шаблонный образец кода Microsoft.

РЕДАКТИРОВАТЬ 2: Вот код для привязки ...

// Apparently, not showing this line of code here has some people confused...
this.DataContext = new SomeClassWithAPropertyCalledNumericValue();

<my:NumericTextBox Value="{Binding NumericValue}" />

Опять ... просто.

Ответы [ 4 ]

6 голосов
/ 11 января 2011

Я думаю

base.SetCurrentValue(ValueProperty, value);

это то, что вы ищете

Резюме
Устанавливает значение свойства зависимости без изменения источника значения.

2 голосов
/ 18 апреля 2010

Я нашел ответ, и тот факт, что никто другой не сказал этого, просто показывает, что очень немногие люди делают свои собственные элементы управления ...

1) Если вы просто вызовете «base.SetValue», вы БУДЕТ уничтожить любую привязку, примененную к вашему пользовательскому свойству - просто так.

2) Что вам нужно сделать, это определить, связаны ли вы, если да, обновите цель вручную (действительно, Microsoft?) - и если вы не связаны, затем Вы можете вызвать base.SetValue.

Вот вспомогательный метод, который мне пришлось сделать:

private void SetValueOrBinding(decimal? value)
{
    var bindingExpression = this.GetBindingExpression(ValueProperty);

    if (bindingExpression == null)
    {
        base.SetValue(ValueProperty, value);
    }
    else
    {
        var target = bindingExpression.DataItem;

        var propertyInfo = target.GetType().GetProperty(bindingExpression.ParentBinding.Path.Path);

        propertyInfo.SetValue(target, value, null);
    }
}

Можете ли вы назвать метод расширения кого-либо?

0 голосов
/ 14 апреля 2010

Вы привязываетесь к NumericValue, но не показываете нам NumericValue. Основываясь исключительно на приведенном выше коде, ваша привязка должна выглядеть примерно так:

<my:NumericTextBox Text="{Binding Value}" />

Если вы действительно хотите связать «Value» с «NumericValue», то вам нужно будет показать нам свойство DependencyProperty для NumericValue.

0 голосов
/ 14 апреля 2010

Я думаю, вам нужно опубликовать больше кода. Вы связываетесь с "NumericValue" в XAML, которого я не вижу в вашем коде C #.

Как дикое предположение, однако, если ваша привязка на самом деле правильная, вам может потребоваться отодвинуться от текстового поля, чтобы увидеть изменение (если вы не проверяли его таким образом), или сделать привязку похожей это изменить с изменением свойства:

{Binding NumericValue, UpdateSourceTrigger=PropertyChanged}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...