2013-04-17 2 views
0

Я не могу понять, как связать мое изображение:Невозможно привязать к DependencyProperty ребенка DependencyObject

<Image Source="{ Binding Path=ViewModel.MainViewModel.ProcessedImage }" Name="image1"/> 

к DependencyProperty ProcessedImage, который является дочерним элементом моего пользовательского класса, производного от DependencyObject:

class ViewModel : DependencyObject 
{ 
    public static ViewModel MainViewModel { get; set; } 

    [...] 

    public BitmapImage ProcessedImage 
    { 
     get { return (BitmapImage)this.GetValue(ProcessedImageProperty); } 
     set { this.SetValue(ProcessedImageProperty, value); } 
    } 
    public static readonly DependencyProperty ProcessedImageProperty = DependencyProperty.Register(
     "ProcessedImage", typeof(BitmapImage), typeof(ViewModel), new PropertyMetadata()); 
} 

Надеюсь, вы сможете мне помочь. Я пробовал разные подходы, но ничего не работает.

+0

Почему ваша виртуальная машина основана на DependencyObject? Вероятно, вы должны использовать INotifyPropertyChanged и установить DataContext в своем представлении равным вашей модели представления. Затем вы можете просто установить путь к ProcessedImage, который может быть POCO –

+0

. Я выбрал этот подход, потому что мне это казалось более простым. Я бы предпочел сохранить его таким образом, если это возможно, конечно. Невозможно ли привязать дочерние элементы класса DependencyObject? – wpfnoop

+0

Просто потому, что что-то проще, не означает, что это обязательно правильно. Шаблон MVVM предназначен для более легкого обслуживания позже. Если вы собираетесь создавать такие зависимости к пользовательскому интерфейсу, то вы можете также придерживаться кодировки WinForms (вы можете использовать WPF для этого) –

ответ

1

Как вы настраиваете контекст данных? Я скопировал код и добавил еще одно свойство - ProcessedImageName со значением по умолчанию «Hello World»

public static readonly DependencyProperty ProcessedImageNameProperty = DependencyProperty.Register(
     "ProcessedImageName", typeof(string), typeof(ViewModel), new PropertyMetadata("Hello World")); 

    public string ProcessedImageName { 
get { return (string)this.GetValue(ProcessedImageNameProperty); } 
set { this.SetValue(ProcessedImageNameProperty, value); }} 

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

public MainWindow() 
    { 
     InitializeComponent(); 
     ViewModel.MainViewModel = new ViewModel(); 
     DataContext = ViewModel.MainViewModel; 
    } 

двутавровых установить путь привязки, как:

<TextBlock Text="{Binding Path=ProcessedImageName }"/> 

Лично я не стал бы продолжать статическое свойство MainViewModel и вместо этого просто новый экземпляр до ViewModel, как так

public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new ViewModel(); 
    } 

Путь к объекту относится к контексту данных, поэтому если свойство Class.PropertyName и контекст данных является классом, то путь привязки является просто PropertyName.

+0

Большое спасибо, вы прибили его! – wpfnoop

Смежные вопросы