【问题标题】:ViewModel notify behind code upon changesViewModel 在更改后通知代码
【发布时间】:2016-02-26 04:10:35
【问题描述】:

目前我正在使用 Telerik 的 Richtextbox,我使用的源代码来自这里。 http://demos.telerik.com/silverlight/#RichTextBox/TelerikEditor I have implemented an autocomplete box such that when items are selected, the mail merge data source is updated according to what was selected.所有代码都在代码后面实现(不在视图模型中)。从 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 论坛上没有任何内容。

【问题讨论】:

    标签: c# wpf mvvm telerik


    【解决方案1】:

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

    此代码将进入控件...

     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 以停止进一步的进展。

    【讨论】:

    • 嗨@John Peters,MessageEventArgs 和路由器无法识别,请问这些参考是什么?
    • 和RoutedEvent的路由器?
    • 代码已更新以反映可行的解决方案。
    猜你喜欢
    • 2021-04-16
    • 1970-01-01
    • 2011-11-25
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多