如何从另一个类设置Onpropertychanged方法

时间:2013-11-11 08:57:48

标签: c# wpf

我有一个继承自ViewModelBase的Class。我需要从其他类设置getter setter。怎么弄这个

    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");
            }
        }
    }

}

现在我需要从其他类而不是“this.SelectedTabItem = this.Items [0]”设置SelectedTabItem。怎么做到这一点?

2 个答案:

答案 0 :(得分: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;

在你想要引发事件并调用你的函数的类中为这个注册处理函数。

答案 1 :(得分: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);
   }
}

无论如何,我建议采用这种方法,因为不清楚为什么要尝试这样做,而不是直接访问属性设置器。我想也许是因为你使用了几个项目,这可能是选择internal访问修饰符的原因。你需要澄清你的问题。