ViewModel在更改后通知代码

时间:2016-02-26 04:10:35

标签: c# wpf mvvm telerik

目前我正在使用Telerik的richtextbox,而我使用的源代码就是从这里开始的。 http://demos.telerik.com/silverlight/#RichTextBox/TelerikEditor我已经实现了一个自动完成框,以便在选择项目时,根据所选内容更新邮件合并数据源。所有代码都在代码后面实现(不在viewmodel中)。来自telerik论坛,看起来itemssource不能绑定到viewmodel。

LetterEditorViewModel.xaml.cs

private void RadAutoCompleteBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var items = Collection.Where(x => RecipientsAutoCompleteBox.SelectedItems.Any(y => y.Id == x.Id);
    radRichTextBox.Document.MailMergeDataSource.ItemsSource = items.ToList();
}

我以编程方式填充应用程序的viewmodel端的自动完成框。当我这样做时,邮件合并按钮不可用,它们仅在调用OnSelectionChange时可用。我想知道是否有另一种方法可以从应用程序的viewmodel端触发OnSelectionChange,或者另一种方式来填充邮件合并数据源,希望是MVVM。 Telerik论坛上没有任何内容。

1 个答案:

答案 0 :(得分:2)

是的,视图模型可以引发路由事件。让我们看一些代码部分来展示这个概念。

此代码将进入控件......

<div class="col-lg-3  col-md-3 col-sm-4 col-xs-12" ng-repeat="product in products">
    <ul>
        <li ng-repeat="description in product.descriptions"> 
            <a href="#">{{ description }}</a> 
        </li>
    </ul>
</div>

使用这个处理程序......可以在控制的CTOR中......

 private void NotifyListeners()
    {
        RoutedEventArgs args = new RoutedEventArgs(RegisteredListeners);
        RaiseEvent(args);
    }

    /// <summary>
    /// The RoutedEvent registered Listeners using a tunneling strategy
    // </summary>
    public static readonly RoutedEvent RegisteredListeners =
     EventManager.RegisterRoutedEvent("RoutedEventListener", RoutingStrategy.Tunnel,
     typeof(RoutedEventHandler), typeof(MyControl));

    /// <summary>
    /// Event Handler registration
    /// </summary>
    public event RoutedEventHandler OnNewMessageReceived
    {
        add { AddHandler(RegisteredListeners, value); }
        remove { RemoveHandler(RegisteredListeners, value); }
    }

  /// <summary>
  /// Called when a command is set and all Registered Listeners are notified
  /// </summary>
  public static EventHandler<EventArgs> OnNotifyNewMessage;

要从视图模型中引发事件,这样就可以了。

       OnNotifyNewMessage = (o, s) =>
        {
            NotifyListeners();
        };

路由事件不包含“集成”的简便方法。因此,您可以设置一个事件处理程序来告诉控件使用冒泡或隧道策略通知所有侦听器...只需确保路由事件最终被标记为processed = true以阻止进一步的进展。