Не может программно связать данные 3 объекта в WPF - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь привязать данные элемента управления Slider к пользовательской модели представления, а затем привязать то же свойство из модели представления к пользовательскому типу, который наследуется от DependencyObject.Режим привязки между моделью представления и элементом управления Slider является двухсторонним, но режим между моделью представления и настраиваемым типом DependencyObject должен быть только односторонним (тип не должен иметь возможности изменять значение модели представления).

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

public class ScanViewModel : DependencyObject
{
    public static readonly DependencyProperty CurrentScanIndexProperty = DependencyProperty.Register("CurrentScanIndex", typeof(Int32), typeof(ScanViewModel), new PropertyMetadata(0));

    public Int32 CurrentScanIndex
    {
        get { return (Int32)GetValue(CurrentScanIndexProperty); }
        set { SetValue(CurrentScanIndexProperty, value); }

В моем XAML я привязываю ползунок следующим образом:

<Slider x:Name="scanIndexSlider" Minimum=0 Maximum = 100 Value="{Binding CurrentScanIndex, Mode=TwoWay, Delay=5}"

У меня есть третий объект, который также участвует:

public class CustomIndicator : DependencyObject
{
    public static readonly DependencyProperty ScanIndexProperty = DependencyProperty.Register("ScanIndex", typeof(Int32), typeof(CustomIndicator), new PropertyMetadata(0));

    public Int32 ScanIndex
    {
        get { return (Int32)GetValue(ScanIndexProperty); }
        set { SetValue(ScanIndexProperty, value); }
    }

    public CustomIndicator(ScanViewModel ViewModel)
    {
        // Data bind to the view model programmatically:
        Binding binding = new Binding("CurrentScanIndex");
        binding.source  = ViewModel;
        binding.Mode    = BindingMode.OneWay;
        BindingOperations.SetBinding(this, CustomIndicator.ScanIndexProperty, binding);
    }

Я присваиваю экземпляр «ScanViewModel» в качестве DataContext представлению, содержащему ползунок, и привязка работает, т.е. я манипулирую ползунком, и свойство зависимостей в модели представления изменяется, чтобы отразить новый ползунокзначение.Однако новое значение моделей представления затем не передается в свойство зависимостей «CustomIndicator.ScanIndex», к которому оно было привязано во время метода конструктора CustomIndicator.Если я бегу по шагам, я вижу, что привязка в конструкторе, кажется, работает изначально ... после того, как программная привязка в конструкторе customIndicator выполнена, «ScanIndex» объекта отражает то же значение, что и модель представления, для которой она была простопривязка, поэтому привязка работает изначально.Однако «ScanIndex» в «CustomIndicator» никогда не изменяется после этого первоначального изменения.Это как если бы привязка работала один раз (в конструкторе), а потом никогда больше.Как я уже упоминал, связь между элементом управления Slider и моделью представления работает нормально.

Я должен добавить, что после создания экземпляра объект CustomIndicator затем добавляется в коллекцию Children пользовательского элемента управления UserControl, который имеет собственный DataContext (другого типа).Может ли это быть проблемой?

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