从wcf服务回调函数更新ObservableCollection

时间:2017-09-20 19:55:35

标签: wpf wcf binding client-server

我目前正致力于基于wcf服务的聊天客户端 - 服务器应用程序,该服务以双工模式运行。我有两个WPF应用程序:服务器本身托管的服务器和客户端。

这是服务合同:

[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(ISendToClient))]
interface IChatService
{
    [OperationContract]
    ChatUser ClientConnect(ChatUser userName);
    [OperationContract]
    void RemoveUser(ChatUser user);
    [OperationContract(IsOneWay = true)]
    void sendNewMessage(ChatMessage message);
}
interface ISendToClient
{
    [OperationContract]
    void newUserConnected(ChatUser user);
    [OperationContract(IsOneWay = true)]
    void deliverNewMessage(ChatMessage message);

}

及其实施:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)]
public class ChatService : IChatService, INotifyPropertyChanged
{
    public ChatService()
    {
        conectedUsers = new ObservableCollection<ChatUser>();
    }

    ISendToClient callback;

    private ObservableCollection<ChatUser> _conectedUsers;

    public ObservableCollection<ChatUser> conectedUsers
    {
        get { return _conectedUsers; }
        set
        {
            if (_conectedUsers == value) return;
            _conectedUsers = value;
            OnPropertyChanged();
        }
    }

    public ChatUser ClientConnect(ChatUser user)
    {
        //do smth
    }

    public List<ChatMessage> GetNewMessages(ChatUser user)
    {
        //do smth
    }

    public void sendNewMessage(ChatMessage newMessage)
    {
        callback = OperationContext.Current.GetCallbackChannel<ISendToClient>();
        callback.deliverNewMessage(newMessage);
    }

   #region PropertyChangedMembers
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged([CallerMemberName]String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    #endregion

}

在clinet方面查看模型包括另外两种方法

    public void newUserConnected(ChatUser user)
    {
        Users.Add(user); 
    }

    public void deliverNewMessage(ChatMessage message)
    {
        messHistory.Add(message);//adding message to ObservaleCollection
        //this Collection is binded to listbox, but not displays
    }

服务器使用此方法通知客户端有关新消息或登录的新用户的信息。

服务配置正确,客户端可以连接到服务器并发送消息,服务器通过在客户端调用deliverNewMessage()方法将它们发送给所有用户,此消息成功添加到ObservaleCollection,绑定到listBox:

<ListBox Grid.Row="0" Margin="3" Name="lst" 
                     ItemsSource="{Binding messHistory}" />

BUT! listBox中不显示任何消息。我试着这样做:

Application.Current.Dispatcher.Invoke(new Action(() =>
        {
            messHistory.Add(message);
        }));

没有效果。 我想,错过了一个小细节,但没有任何线索。

我很感激如何解决这个问题。

0 个答案:

没有答案