2016-02-26 75 views
0

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

回答

2

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

该代码会去控制......

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即可停止进一步的进度。

+0

嗨@John彼得斯,MessageEventArgs和路由器不被识别,请问这些引用是指哪些引用? – Master

+0

和路由器RoutedEvent? – Master

+1

感谢您的帮助=) – Master