2016-09-16 3 views
1

Я создал представление (MyView), где я включил UserControl так:Wpf Prism - Передача параметра из поля зрения на ViewModel

<StackPanel> 
    <ctrl:ViewDialog DataContext="{Binding CtrlViewDialog}" Message="Hello" Name="ctrlViewDialog" >      
</ctrl:ViewDialog> 

код позади зрения:

public MyView() 
     { 
      InitializeComponent(); 
      var _message = ctrlViewDialog.Message; 
     } 

     [Dependency] 
     public MyViewViewModel ViewModel 
     { 
      get 
      { 
       return (MyViewViewModel)this.DataContext; 
      } 
      set 
      { 

       this.DataContext = value; 
      } 
     } 

и моделью просмотра MyViewViewModel является:

public MyViewViewModel() 
     {   

      ViewDialogViewModel CtrlViewDialog = new ViewDialogViewModel(Message); 
     } 

код позади включенного UserControl (ViewDialog) является:

private string message; 
     public string Message 
     { 
      get { return message; } 
      set { message = value; } 
     } 


     public ViewDialog() 
     { 
      InitializeComponent(); 
     } 

Как я могу передать параметр MyView "_message" в MyViewViewModel для того, чтобы передать его экземпляру ViewDialogViewModel CtrlViewDialog = new ViewDialogViewModel(Message);

+0

Вы уверены, что это то, что вы хотите сделать? используя (MyViewViewModel) this.DataContext; в представлении обычно является признаком того, что вы не делаете все правильно. Что вы используете для DI в призме? –

+0

Ok Filip, я мог бы удалить (MyViewViewModel) this.DataContext; но я бы хотел передать Message = "Hello" (xaml) из view в viewmodel. Есть ли другой путь? –

ответ

2

Ok я попытаюсь ответьте на заданные вами вопросы о дереве. Первое связано с C#. Ты можешь сделать это?

public MyViewViewModel() 
{  
    ViewDialogViewModel CtrlViewDialog = new ViewDialogViewModel(Message); 
} 

Конструктор не будет работать, прежде чем вы заполните свойства.

Второе вы можете передать это значение от вас. Просмотр модели вашего вида с использованием WPF? Да. Это может быть сделано и в конструкторе, но для этого потребуется намного больше кода. Вы можете сделать это, когда управление станет легче загружаться.

<UserControl 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:prism="http://prismlibrary.com/" 
      xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
      xmlns:vm="clr-namespace:PrismTest.ViewModels" 
      xmlns:view="clr-namespace:PrismTest.Views" 
      x:Class="PrismTest.Views.TestView" 
      prism:ViewModelLocator.AutoWireViewModel="True"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="Loaded"> 
      <i:InvokeCommandAction Command="{Binding LoadedCommand}" CommandParameter="{Binding Message, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type view:TestView}}}" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
    <Grid> 
     <StackPanel> 
      <TextBlock Text="{Binding Message, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type view:TestView}}}"/> 
      <TextBlock Text="{Binding Message}"/> 
     </StackPanel> 
    </Grid> 
</UserControl> 

команда

private ICommand loadedCommand = new DelegateCommand<string>(text => 
     { 
      MessageBox.Show(text); 
     }); 
     public ICommand LoadedCommand { get { return loadedCommand; } } 

И теперь это то, что вы должны сделать в призме? Хорошо передающие параметры да. Выполнение этого ViewDialogViewModel CtrlViewDialog = new ViewDialogViewModel(Message); и этого

(MyViewViewModel)this.DataContext; 

NO !!! Если вы хотите использовать призм, то инъекция зависимости является самой важной частью. Вы можете посмотреть на this и this.

+0

Filip «Сообщение» в конструкторе не является свойством элемента управления, извините за использование одного и того же имени;). Остальная часть кода, который вы предлагаете, работает нормально. Отличное решение –

+0

Рад, что я мог бы помочь. Просто укажите только, если свойство Массажа - свойство только для чтения, которое не имеет сеттера 'Massage {get {return" НЕКОТОРАЯ СТОИМОСТЬ ИСПОЛЬЗОВАНИЯ "; }} 'вы можете использовать его в конструкторе, используя его в новом' ViewModel() {Message = "Some Value"} 'Всегда будет запускать конструктор сначала, а затем setterter. –

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