Как передать изменения из источника в привязку TwoWay? - PullRequest
1 голос
/ 19 сентября 2011

Я создал пользовательский элемент управления TextBox (но не производный от TextBox), который содержит свойство зависимости "Text".

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

Как изнутри моего пользовательского элемента управления TextBox как обновить свойство Text таким образом, чтобы изменение распространялось на свойство модели представления?

Если я установилсвойство «Текст» в моем пользовательском элементе управления, которое заменяет привязку, оставляя свойство в модели представления как ноль.

Я бы подумал, что это будет просто, но я не вижу, как это сделать (это должен делать стандартный элемент управления TextBox!)

Приветствия

Редактировать:

Пользовательский элемент управления:

public class SampleCustomControl : CustomControl
{
    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

    public static readonly DependencyProperty TextProperty =
        DependencyProperty.Register("Text", typeof(string), typeof(SampleCustomControl), new PropertyMetadata(null));

    public void Update()
    {
        // This replaces my binding, I want it to pass the new value 
        // through to the "SomeProperty" two way binding.
        Text = "some value";
    }

}

Использование:

<Controls:SampleCustomControl Text="{Binding SomeProperty, Mode=TwoWay}" />

Ответы [ 2 ]

2 голосов
/ 19 сентября 2011

Вам необходимо добавить обратный вызов Property Changed в метаданные вашего свойства зависимости .

Этот обратный вызов будет запущен при изменении свойства Text (с любой стороны). Вы можете использовать значение, переданное из этого, чтобы обновить свой пользовательский интерфейс, который вы создали для отображения текста.

Обновление: Отвечая на ваш комментарий о том, что это такое. Поскольку ваш пример кода слишком расплывчат для проверки, вот что я использовал для проверки вашей проблемы.

public class TestControl : ContentControl
{
    private TextBlock _tb;

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        _tb = new TextBlock();
        _tb.Text = Text;
        this.Content = _tb;
        _tb.MouseLeftButtonDown += new MouseButtonEventHandler(_tb_MouseLeftButtonDown);
    }

    void _tb_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        Update();
    }

    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

    public static readonly DependencyProperty TextProperty =
        DependencyProperty.Register("Text", typeof(string), typeof(TestControl), new PropertyMetadata(string.Empty, OnTextChanged));

    public void Update()
    {
        // This replaces my binding, I want it to pass the new value 
        // through to the "SomeProperty" two way binding.
        Text = "some value";
    }

    public static void OnTextChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        ((TestControl)sender).UpdateText((string)e.NewValue);
    }

    protected void UpdateText(string text)
    {
        if (_tb != null) _tb.Text = text;
    }
}

Затем я связал свойство Text в моем элементе управления с моделью представления, используя двустороннюю привязку. Когда я щелкаю текст в представлении, и представление, и модель представления обновляются новым текстом «некоторое значение». Если я обновляю значение в viewmodel (и поднимаю событие измененного свойства), значение обновляется в представлении и элементе управления, поэтому привязка остается в силе.

В вашем примере должно быть несколько других недостающих фрагментов.

0 голосов
/ 20 сентября 2011

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

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