首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用conductor使属性在所有屏幕上都可访问?

如何使用conductor使属性在所有屏幕上都可访问?
EN

Stack Overflow用户
提问于 2014-07-27 02:57:16
回答 2查看 77关注 0票数 0

我在窗户上挂了一台ListBox。此窗口的模型使用具有导体的Caliburn:

代码语言:javascript
复制
public class ShellViewModel : Conductor<IScreen>.Collection.OneActive

我的屏幕是用户控件(每个UC都有一个型号),当我单击TabControl上的选项卡时会加载这些控件。

我希望能够在所有屏幕上访问ListBox selected item。

我该怎么做?

EN

回答 2

Stack Overflow用户

发布于 2014-07-28 00:18:42

我可以使用EventAggreagator

在我的AppBootstraper类中,我可以添加:

代码语言:javascript
复制
private CompositionContainer _container;

Config方法下:

代码语言:javascript
复制
var batch = new CompositionBatch();

batch.AddExportedValue<IWindowManager>(new WindowManager());
batch.AddExportedValue<IEventAggregator>(new EventAggregator());
batch.AddExportedValue(_container);

_container.Compose(batch);

在我的main ViewModel的构造函数中:

代码语言:javascript
复制
IEventAggregator eventAggregator

在绑定的属性中:

代码语言:javascript
复制
public Thing SelectedThing
{
    get { return _selectedThing; }
    set
    {
        _selectedThing = value;
        NotifyOfPropertyChange(() => SelectedThing);

        _eventAggregator.PublishOnUIThread(SelectedThing);
    }
}

然后在我的屏幕模型上:

代码语言:javascript
复制
public class MyScreenViewModel : Screen, IHandle<Thing>

在构造函数中:

代码语言:javascript
复制
IEventAggregator eventAggregator

然后:

代码语言:javascript
复制
_eventAggregator = eventAggregator;
_eventAggregator.Subscribe(this);

接口实现:

代码语言:javascript
复制
void IHandle<Thing>.Handle(Thing selectedThing)
{
    this.SelectedThing = selectedThing;
}

更多信息:Caliburn Micro Part 4: The Event Aggregator

票数 0
EN

Stack Overflow用户

发布于 2014-07-31 20:44:35

另一种选择(虽然耦合程度更高)是利用屏幕有一个"Parent“属性这一事实,您可以使用该属性来访问它们的conductor;因此,您可以在MyScreenViewModel中执行类似以下操作。

代码语言:javascript
复制
void GetSelectedThing()
{
var conductingVM= this.Parent as ShellViewModel ;
this.SelectedThing = conductingVM.SelectedThing;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24974468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档