可能是我对这个问题的制定是不正确的(“如何绑定到API类实例的get-only属性?”)但这是我的问题: 我正在创建powerpoint vsto加载项,我需要将具体幻灯片的SlideIndex属性绑定到Windows窗体上的文本框。 SlideIndex属性只有get访问器。我发现在绑定的情况下我需要使用mvvm。根据mvvm主题的示例,我从NuGet Packege Manager安装了MvvmLightLibs到我的解决方案,并希望用这种方式“包装”幻灯片对象:
public class SlideWraper: ViewModelBase
{
private PowerPoint.Slide Sld;
public int SlideIndex
{
get
{
return Sld.SlideIndex;
}
set
{
RaisePropertyChanged(() => Sld.SlideIndex);
}
}
public SlideWraper(PowerPoint.Slide sld)
{
Sld=sld;
}
}
这是我的绑定创建代码:
...
PowerPoint.Slide ConcreteSlide=this.Application.ActivePresentation.
Slides.FindBySlideID(257);
SlideWraper MyWraper=new SlideWraper(ConcreteSlide);
MyTextBox.DataBindings.Add(new Binding("Text", MyWraper, "SlideIndex"));
...
但是这个实现仅在程序开始时用正确的幻灯片索引填充文本框。当我替换幻灯片(幻灯片索引已更改)时,MyTextBox.Text未更改。
如何绑定幻灯片的get-only属性?
答案 0 :(得分:0)
这里有一些选择。如果PowerPoint.Slide
支持INPC,那么您应该直接公开它......
private PowerPoint.Slide Sld;
public PowerPoint.Slide Slide
{
get {return Sld;}
set {this.Sld = value; RaisePropertyChanged(() => Slide);}
}
...然后在XAML中绑定到Slide.SlideIndex
。
如果PowerPoint.Slide不支持INPC,则需要在视图模型中创建常规int属性,并安排PowerPoint.Slide更新该属性以响应其SlideIndex
值的更改。 / p>
最后,如果您知道SlideIndex刚刚更新,那么您可以调用`RaisePropertyChanged(“Slide”)',这可能会很慢,因为它会导致所有对Slide属性的绑定更新,但有时它是唯一的选择。
无论哪种方式,自动更新都不能自己神奇地工作,PowerPoint.Slide需要有一些机制来通知程序的其余部分它的SlideIndex
属性已经改变。