2013-08-08 4 views
0

Извините, что вы клише ... но я довольно новичок в WPF и MVVM, поэтому я не уверен, как с этим справиться. У меня есть элемент управления WinForms в одном из моих представлений, который мне нужно изменить в его коде, когда событие возникает в ViewModel. Свойство datacontext моего представления наследуется, поэтому viewmodel не определен в конструкторе представлений. Как я буду правильно обращаться с этим? Я не использую никаких фреймворков со встроенными мессенджерами или агрегаторами. Мой соответствующий код приведен ниже. Мне нужно запустить метод ChangeUrl из моего ViewModel.Alter размещен элемент управления Winform от ViewModel

EDIT: Исходя из предложения HighCore, я обновил свой код. Тем не менее, я все еще не могу выполнить метод ChangeUrl, событие создается в моей модели ViewModel. Какие изменения необходимо внести?

UserControl.xaml

<UserControl ...> 
    <WindowsFormsHost> 
     <vlc:AxVLCPlugin2 x:Name="VlcPlayerObject" /> 
    </WindowsFormsHost> 
</UserControl> 

UserControl.cs

public partial class VlcPlayer : UserControl 
{ 
    public VlcPlayer() 
    { 
     InitializeComponent(); 
    } 

    public string VlcUrl 
    { 
     get { return (string)GetValue(VlcUrlProperty); } 
     set 
     { 
      ChangeVlcUrl(value); 
      SetValue(VlcUrlProperty, value); 
     } 
    } 

    public static readonly DependencyProperty VlcUrlProperty = 
      DependencyProperty.Register("VlcUrl", typeof(string), typeof(VlcPlayer), new PropertyMetadata(null)); 

    private void ChangeVlcUrl(string newUrl) 
    { 
     //do stuff here 
    } 
} 

view.xaml

<wuc:VlcPlayer VlcUrl="{Binding Path=ScreenVlcUrl}" /> 

ViewModel

private string screenVlcUrl; 
public string ScreenVlcUrl 
{ 
    get { return screenVlcUrl; } 
    set 
    { 
     screenVlcUrl = value; 
     RaisePropertyChangedEvent("ScreenVlcUrl"); 
    } 
} 
+0

WinForms не поддерживает MVVM. вам нужно будет хранить ссылку на представление из любого места, где это необходимо, или использовать EventAggregator или что-то в этом роде. –

+0

В противном случае поместите ваши вещи winforms в WPF 'UserControl' и создайте некоторые DependencyProperties в этом UserControl и манипулируйте элементами winforms в обратных вызовах изменения свойств этих DP. –

+0

@HighCore - Спасибо за предложение. Однако я внес рекомендуемые изменения, но он все еще не работает должным образом. Что я пропустил? – user1017477

ответ

0

WPF не выполняет вашу собственность сеттер, когда вы Свяжите свойство, вместо этого вы должны определить метод обратного вызова в объявлении DependencyProperty:

public string VlcUrl 
{ 
    get { return (string)GetValue(VlcUrlProperty); } 
    set { SetValue(VlcUrlProperty, value); } 
} 

public static readonly DependencyProperty VlcUrlProperty = 
     DependencyProperty.Register("VlcUrl", typeof(string), typeof(VlcPlayer), new PropertyMetadata(null, OnVlcUrlChanged)); 

private static void OnVlcUrlChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
{ 
    var player = obj as VlcPlayer; 
    if (obj == null) 
     return; 

    obj.ChangeVlcUrl(e.NewValue); 
} 

private void ChangeVlcUrl(string newUrl) 
{ 
    //do stuff here 
} 
+0

Огромное спасибо за вашу помощь, которая сделала трюк! В то же время я нашел этот http://stackoverflow.com/questions/9391363/can-i-add-a-dependencyproperty-on-an-windows-user-control, который указывал на меня в том же направлении. Еще раз спасибо! – user1017477

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