Я пытаюсь привязать данные элемента управления 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 (другого типа).Может ли это быть проблемой?