如何绑定到API类instace的get-only属性?

时间:2016-01-25 19:38:20

标签: c# winforms mvvm data-binding

可能是我对这个问题的制定是不正确的(“如何绑定到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属性?

1 个答案:

答案 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属性已经改变。

相关问题