C# ViewModel更改时通知隐藏代码

C# ViewModel更改时通知隐藏代码,c#,wpf,mvvm,telerik,C#,Wpf,Mvvm,Telerik,目前我正在使用Telerik的richtextbox,我使用的源代码来自这里。我已经实现了一个自动完成框,这样当选择项目时,邮件合并数据源将根据所选内容进行更新。所有代码都在代码后面实现(不在viewmodel中)。从telerik论坛上看,itemssource似乎无法绑定到viewmodel LetterEditorViewModel.xaml.cs private void RadAutoCompleteBox_OnSelectionChanged(object sender, Selec

目前我正在使用Telerik的richtextbox,我使用的源代码来自这里。我已经实现了一个自动完成框,这样当选择项目时,邮件合并数据源将根据所选内容进行更新。所有代码都在代码后面实现(不在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论坛上没有任何内容。

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

 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();
        };
要从视图模型引发事件,可以这样做

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

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

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

 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();
        };
要从视图模型引发事件,可以这样做

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

路由事件不包含“集成”的简单方法。因此,您可以设置eventhandler,告诉控件使用气泡或隧道策略通知所有侦听器。。。只需确保最终路由事件被标记为handled=true,以停止进一步的进程。

Hi@John Peters,MessageEventArgs和Router未被识别,请问它们指的是什么?和Router to RoutedEvent?感谢您的帮助=)代码已更新,以反映有效的解决方案。Hi@John Peters,MessageEventArgs和Router未被识别,请问它们指的是什么?以及Router到RouteEvent?感谢您的帮助=)代码已更新,以反映一个正常的解决方案。