views:

455

answers:

1

Hi All,

I've a class on the server

   [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
}

I communicate with my server via WCF. This class shoud be [MessageContract] because of the streaming - (all of my other classes uses [DataContract] anyway).

My problem is that after I generate the classes with SvcUtil on client side I lost the INotify... interface...I get this:

    [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;
    }
}

Without INotifyPropertyChanged the databinding doesn't work I know but I can add it on client side as I did this way:

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

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

    #endregion
}

But still the databinding doesn't work. Do you have any idea? I can't use the databinding with a [MessageContract] class at all???

Thanks for your answers in advance!

A: 

A message contract only specifies the structure of the message. Any interfaces present on the server-side will not appear on the client side, since they have nothing to do with the structure of the message.

Besides, if your client were written in Java, what would it do with those interfaces?

John Saunders
Ok. Thank you for the fast answer! I thought, but now I know it :).But I still don't understand why I failed to bind properly when I tried to add the interface on local side - as you see it at the last part in my note. Do you know?
Hunsoul
But you never raised the event, did you? I don't know WPF, but surely there needs to be some code to raise that event, otherwise WPF will not know about the change.
John Saunders