2013-11-11 4 views
0

У меня есть класс, который наследуется от ViewModelBase. Мне нужно установить геттер-сеттер из другого класса. Как получить этотКак установить метод Onpropertychanged из другого класса

public class UserScreenViewModel : ViewModelBase 
{ 

    public UserScreenViewModel() 
    { 
     this.Items = new ObservableCollection<TabDataItem>(); 
     try 
     { 
      ..... 
       var allLayouts = context.PANEL_LAYOUTS; 

       foreach (var layouts in allLayouts) 
       { 
        TabDataItem item = new TabDataItem() 
        { 
         Header = layouts.Header, 
        }; 
        this.Items.Add(item); 
       } 
      } 
      this.SelectedTabItem = this.Items[0]; 
     } 

    } 
    public ObservableCollection<TabDataItem> Items { get; set; } 

    private TabDataItem selectedItem; 
    /// <summary> 
    ///  Gets or sets the SelectedTabItem. 
    /// </summary> 
    public TabDataItem SelectedTabItem 
    { 
     get 
     { 
      return this.selectedItem; 
     } 
     internal set 
     { 
      if (this.selectedItem != value) 
      { 
       this.selectedItem = value; 
       OnPropertyChanged("SelectedTabItem"); 
      } 
     } 
    } 

} 

Теперь мне нужно установить SelectedTabItem из другого класса, вместо «this.SelectedTabItem = this.Items [0]». Как достичь этого?

+0

Вы считаете, что «SelectedTabItem» является наследственным имуществом? – James

+0

Я не очень хорошо понимаю ваш вопрос. Вы хотите установить «this.SelectedTabItem = this.Items [0]» из другого класса, допустим, «AnotherClass»? –

+0

Вам понадобится ссылка на 'UserScreenViewModel'. – Silvermind

ответ

0

нравится этот

public class NotificationClass : INotifyPropertyChanged 
{ 
    private TabDataItem selectedItem; 

    protected void OnPropertyChanged(PropertyChangedEventArgs e) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
      handler(this, e); 
    } 

    protected void OnPropertyChanged(string propertyName) 
    { 
     OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); 
    } 

    /// <summary> 
    ///  Gets or sets the SelectedTabItem. 
    /// </summary> 
    public TabDataItem SelectedTabItem 
    { 
     get 
     { 
      return this.selectedItem; 
     } 
     internal set 
     { 
      if (this.selectedItem != value) 
      { 
       this.selectedItem = value; 
       OnPropertyChanged("SelectedTabItem"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

Вы должны зарегистрировать обработчик событий для этого, если его отношения к специфическому свойству

protected void OnSelectedTabItemChanged(EventArgs e) 
{ 
    EventHandler handler = SelectedTabItemChanged;; 
    if (handler != null) 
     handler(this, e); 
} 

public event EventHandler SelectedTabItemChanged; 

Регистрация даже функция обработчика для этого в классе, где вы хотите, чтобы поднять событие и вызовите свою функцию.

0

Как я понял из Вашего комментария, я думаю, что вы должны сделать что-то вроде этого:

public class UserScreenViewModel : ViewModelBase 
{ 
    public void SetSelectedTabItem() 
    { 
     this.SelectedTabItem = this.Items[0]; 
    } 
} 

public class NewClass 
{ 
    public UserScreenViewModel UserViewModel {get; set;} 

    public NewClass(UserScreenViewModel userViewModel) 
    { 
     this.UserViewModel = userViewModel; 
     this.UserViewModel.SetSelectedTabItem(); 
    } 
} 

Очевидно, что вам нужно сослаться на текущий экземпляр вашего UserScreenViewModel в собственности NewClass, что вы можете сделать в инициализация программы, в коде позади вашего основного зрения, используя этот псевдо-код:

public class MainView 
{ 
    public MainView() 
    { 
     InitializeComponent(); 
     var userViewModel = new UserScreenViewModel(); 
     this.DataContext = userViewModel(); 
     var newClass = new NewClass(userViewModel); 
    } 
} 

во всяком случае, я предлагаю такой подход, потому что это не понятно, почему вы пытаетесь сделать это, вместо того, чтобы напрямую доступ к свойство setter. Я думаю, может быть, потому, что вы используете несколько проектов, и это может быть причиной выбора модификатора доступа internal. Вы должны уточнить свой вопрос.

+0

Это кажется излишне сложным. Установщик свойств 'SelectedTabItem' имеет видимость' internal ', поэтому, если OP не использует несколько проектов (которые OP действительно должен прояснить в вопросе, если это так), средство настройки свойств должно быть доступно уже. – hvd

+0

@hvd Да, это может быть немного сложнее. ОП, действительно, не указывает, использует ли он несколько проектов, и я думаю, что именно по этой причине он задал этот вопрос. В противном случае, как вы сказали, средство настройки свойств должно быть уже доступно. –

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