2009-07-21 2 views
0

У меня есть класс на сервереWPF Databinding проблема WCF [MessageContract] класса

[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] вообще?

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

ответ

0

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

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

+0

ОК. Спасибо за быстрый ответ! Я думал, но теперь я это знаю :). Но я до сих пор не понимаю, почему я не смог правильно связать себя, когда пытался добавить интерфейс на локальной стороне - как вы видите это в последней части моей заметки. Вы знаете? – Hunsoul

+0

Но вы никогда не поднимали это событие, не так ли? Я не знаю WPF, но, конечно же, для повышения этого события должен быть какой-то код, иначе WPF не будет знать об изменениях. –

Смежные вопросы