2016-01-05 1 views
-1
.

. Я пытаюсь закодировать программу, где, если вы нажмете на элемент списка или кнопку в одном пользовательском контроле, он обновит текстовое поле в другом usercontrol. Кажется, я не могу понять, как правильно работать с зависимостью.Нужна помощь при создании кнопки в одном UserControl. Обновите GUI в другом UserControl, используя «Свойства» в C#

Listbox.xaml

<UserControl x:Class="TestDP3.ListBoxUserControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:TestDP3"> 
<UserControl.DataContext> 
    <local:MyViewModel/> 
</UserControl.DataContext> 
<Grid> 
    <ListBox x:Name="lstbox" HorizontalAlignment="Left" Height="144" Margin="21,23,0,0" VerticalAlignment="Top" Width="149" SelectionChanged="Selector_OnSelectionChanged"/> 

    <Button Content="Button" HorizontalAlignment="Left" Margin="105,231,0,0" VerticalAlignment="Top" Width="75" Command="{Binding TestCommand}"/> 
    <TextBlock HorizontalAlignment="Left" Margin="52,272,0,0" TextWrapping="Wrap" Text="{Binding MyDp.Result}" VerticalAlignment="Top"/> 

</Grid> 

VnInfo.xaml

<UserControl x:Class="TestDP3.VnInfoUserControl" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300" 
      xmlns:local="clr-namespace:TestDP3"> 
    <UserControl.DataContext> 
     <local:MyViewModel/> 
    </UserControl.DataContext> 
    <Grid> 
     <TextBlock HorizontalAlignment="Left" Margin="10,102,0,0" TextWrapping="Wrap" Text="DependencyProperty is: " VerticalAlignment="Top"/>  
     <TextBlock HorizontalAlignment="Left" Margin="159,102,0,0" TextWrapping="Wrap" Text="{Binding MyDp.Result, Mode=TwoWay}" VerticalAlignment="Top"/> 
    </Grid> 
</UserControl> 

MyViewModel.cs

public class MyViewModel : INotifyPropertyChanged 
    { 
     private MyDP _myDP; 
     public event PropertyChangedEventHandler PropertyChanged; 
     public MyViewModel() 
     { 
      _myDP = new MyDP(); 

      TestCommand = new MyCommand(SampleMethod); 

     } 

     public MyDP MyDp 
     { 
      get { return _myDP; } 
      set 
      { 
       _myDP = value; 
       RaisePropertyChanged("MyDP");    
      } 
     } 

     private void RaisePropertyChanged(string propertyName) 
     { 
      PropertyChangedEventHandler handler = this.PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

     public ICommand TestCommand { get; set; } 

     private int counter = 0; 
     private int SampleMethod() 
     { 
      MyDp.Result = counter++; 
      return MyDp.Result; 
     } 
    } 

MyDP.cs

public class MyDP : DependencyObject 
    { 
     public int Result 
     { 
      get { return (int)GetValue(ResultProperty); } 
      set { SetValue(ResultProperty, value); } 
     } 
     public static readonly DependencyProperty ResultProperty = 
      DependencyProperty.Register("Result", typeof(int), typeof(MyDP) ,new PropertyMetadata(0) 
      );   
    } 

Вот ссылка на Visual Studio проекта: https://dl.dropboxusercontent.com/u/22398345/TestDP.zip

+0

Я знаком с WPF и MVVM, но я никогда не играл с настройкой DataContext в xaml. Является в каждом файле xaml, фактически ссылающемся на один и тот же объект, или этот вызов создает все новые объекты? – Tim

+0

Вы не правы, это невозможно в этом случае, если вы используете инфраструктуру mvvm, попробуйте использовать посланник для отправки событий между моделями просмотра. Вот пример mvvm light messenger: http://stackoverflow.com/questions/16993918/mvvm-light-messenger-sending-and-registering-objects – Younes

ответ

0

Оба вида должны обращаться к одному объекту (ViewModel). Я подозреваю, что ваши звонки в

<local:MyViewModel/> 

В каждом файле Xaml создаются отдельные объекты. Вам нужно создать единый объект MyViewModel в коде-позади где-то:

MyViewModel vm = new MyViewModel(); 

и передать ссылку на него, чтобы каждый из видов, либо с помощью конструктора:

ListBoxUserControl(MyViewModel vm) { ... } 

или к свойство:

ListBoxUserControl.MyViewModel = vm; 

затем вы можете установить DataContext в коде-за:

this.DataContext = vm;