视图模型在代码更改时通知

本文关键字:通知 代码 模型 视图 | 更新日期: 2023-09-27 18:36:13

目前我正在使用Telerik的richtextbox,我使用的源代码来自这里。 http://demos.telerik.com/silverlight/#RichTextBox/TelerikEditor 我实现了一个自动完成框,以便在选择项目时,邮件合并数据源将根据所选内容进行更新。所有代码都是在代码后面实现的(不在视图模型中)。从 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();
}

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

视图模型在代码更改时通知

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

此代码将进入控件...

 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;

有了这个处理程序...可能在CTOR的控制中...

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

要从视图模型引发事件,这将完成。

MyControl.OnNotifyNewMessage("Message Helpers 1360", new EventArgs());

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