0

我有一个继承自 ViewModelBase 的类。我需要从其他类设置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");
            }
        }
    }

}

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

4

2 回答 2

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;

在要引发事件并调用函数的类中为此注册甚至处理函数。

于 2013-11-11T09:04:01.280 回答
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访问修饰符的原因。你需要澄清你的问题。

于 2013-11-11T09:32:15.820 回答