Проблема привязки данных WPF класса WCF [MessageContract] - PullRequest
0 голосов
/ 21 июля 2009

У меня есть класс на сервере

   [MessageContract]
public class RemoteFileInfo : IDisposable, INotifyPropertyChanged
{
    [MessageHeader(MustUnderstand = true)]
    public string _FileName;

    [MessageHeader(MustUnderstand = true)]
    public string FileName
    {
        get { return _FileName; }
        set { _FileName = value; }
    }


    [MessageBodyMember(Order = 1)]
    public System.IO.Stream _FileByteStream;

    [MessageHeader(MustUnderstand = true)]
    public System.IO.Stream FileByteStream
    {
        get { return _FileByteStream; }
        set { _FileByteStream = value; }
    }

    public void Dispose()
    {
        // close stream when the contract instance is disposed. 
        // this ensures that stream is closed when file download 
        // is complete, since download procedure is handled by the client 
        // and the stream must be closed on server.
        if (_FileByteStream!=null)
        {
            _FileByteStream.Close();
            _FileByteStream = null;
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void SendPropertyChanged(String propertyName)
    {
        if ((this.PropertyChanged != null))
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #endregion
}

Я общаюсь с моим сервером через WCF. Этот класс должен быть [MessageContract] из-за потоковой передачи - (все мои другие классы в любом случае используют [DataContract]).

Моя проблема в том, что после того, как я сгенерировал классы с помощью SvcUtil на стороне клиента, я потерял интерфейс INotify ... ... Я получаю это:

    [System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.MessageContractAttribute(WrapperName="RemoteFileInfo", WrapperNamespace="http://tempuri.org/", IsWrapped=true)]
public partial class RemoteFileInfo
{
    [System.ServiceModel.MessageHeaderAttribute(Namespace="http://tempuri.org/")]
    public System.IO.Stream FileByteStream;

    [System.ServiceModel.MessageHeaderAttribute(Namespace="http://tempuri.org/")]
    public string FileName;

    [System.ServiceModel.MessageHeaderAttribute(Namespace="http://tempuri.org/")]
    public string _FileName;

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://tempuri.org/", Order=0)]
    public System.IO.Stream _FileByteStream;

    public RemoteFileInfo()
    {
    }

    public RemoteFileInfo(
                System.IO.Stream FileByteStream, 
                string FileName, 
                string _FileName, 
                System.IO.Stream _FileByteStream)
    {
        this.FileByteStream = FileByteStream;
        this.FileName = FileName;
        this._FileName = _FileName;
        this._FileByteStream = _FileByteStream;
    }
}

Без INotifyPropertyChanged привязка данных не работает, я знаю, но я могу добавить ее на стороне клиента, как я сделал так:

    public partial class RemoteFileInfo : System.ComponentModel.INotifyPropertyChanged
{
    #region INotifyPropertyChanged Members

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

    #endregion
}

Но, тем не менее, привязка данных не работает. Есть ли у вас какие-либо идеи? Я не могу использовать привязку данных с классом [MessageContract] вообще *

Спасибо за ваши ответы заранее!

1 Ответ

0 голосов
/ 21 июля 2009

В договоре на сообщение указывается только структура сообщения. Любые интерфейсы, присутствующие на стороне сервера, не будут появляться на стороне клиента, так как они не имеют ничего общего со структурой сообщения.

Кроме того, если бы ваш клиент был написан на Java, что бы он делал с этими интерфейсами?

...