2011-10-09 9 views
6

Sto creando un progetto utilizzando una porta seriale. Mi sto esercitando con il modello MVVM. Ho bisogno di impostare la porta seriale, quindi sto usando una barra degli strumenti.Come implementare le barre degli strumenti quando si utilizza il pattern MVVM?

Questo è il mio modello:

public class Port : INotifyPropertyChanged, IDataErrorInfo 
{ 
    private SerialPort _serialPort; 

    public Port() 
    { 
     _serialPort = new SerialPort(); 
    } 

    public string PortName 
    { 
     get { return _serialPort.PortName; } 
     set 
     { 
      _serialPort.PortName = value; 
      OnPropertyChanged("PortName"); 
     } 
    } 

    public int BaudRate 
    { 
     get { return _serialPort.BaudRate; } 
     set 
     { 
      _serialPort.BaudRate = value; 
      OnPropertyChanged("BaudRate"); 
     } 
    } 

    public Parity Parity 
    { 
     get { return _serialPort.Parity; } 
     set 
     { 
      _serialPort.Parity = value; 
      OnPropertyChanged("Parity"); 
     } 
    } 

    public int DataBits 
    { 
     get { return _serialPort.DataBits; } 
     set 
     { 
      _serialPort.DataBits = value; 
      OnPropertyChanged("PortDataBits"); 
     } 
    } 

    public StopBits StopBits 
    { 
     get { return _serialPort.StopBits; } 
     set 
     { 
      _serialPort.StopBits = value; 
      OnPropertyChanged("PortStopBits"); 
     } 
    } 

    public Handshake Handshake 
    { 
     get { return _serialPort.Handshake; } 
     set 
     { 
      _serialPort.Handshake = value; 
      OnPropertyChanged("PortHandshake"); 
     } 
    } 

    public string[] AvailablePortNames 
    { 
     get { return SerialPort.GetPortNames(); } 
    } 

    #region IDataErrorInfo Members 

    string IDataErrorInfo.Error { get { return null; } } 

    string IDataErrorInfo.this[string propertyName] 
    { 
     get { return this.GetValidationError(propertyName); } 
    } 

    #endregion // IDataErrorInfo Members 

    #region Validation 

    /// <summary> 
    /// Returns true if this object has no validation errors. 
    /// </summary> 
    public bool IsValid 
    { 
     get 
     { 
      foreach (string property in ValidatedProperties) 
       if (GetValidationError(property) != null) 
        return false; 

      return true; 
     } 
    } 

    static readonly string[] ValidatedProperties = 
    { 
     "PortName", 
    }; 

    string GetValidationError(string propertyName) 
    { 
     if (Array.IndexOf(ValidatedProperties, propertyName) < 0) 
      return null; 

     string error = null; 

     switch (propertyName) 
     { 
      case "PortName": 
       ValidatePortName(); 
       break; 

      default: 
       Debug.Fail("Unexpected property being validated on Port: " + propertyName); 
       break; 
     } 

     return error; 
    } 

    string ValidatePortName() 
    { 
     if (IsStringMissing(this.PortName)) 
     { 
      return Strings.Port_Error_MissingName; 
     } 
     return null; 
    } 

    #endregion // Validation 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     this.VerifyPropertyName(propertyName); 

     PropertyChangedEventHandler handler = this.PropertyChanged; 
     if (handler != null) 
     { 
      var e = new PropertyChangedEventArgs(propertyName); 
      handler(this, e); 
     } 
    } 

    #endregion // INotifyPropertyChanged Members 
} 

Poi, ho un SetupPortView:

<UserControl 
    x:Class="PortChat.View.SetupPortView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:vw="clr-namespace:PortChat.View" 
> 
<ToolBar> 
    <Label Content="COM Port:" 
     Target="{Binding ElementName=AvailablePortsComboBox}" 
    /> 
    <ComboBox 
     x:Name="AvailablePortsComboBox" 
     Width="80" 
     ItemsSource="{Binding Path=AvailablePortNames, Mode=OneTime}" 
     SelectedItem="{Binding Path=PortName, ValidatesOnDataErrors=True}" 
     Validation.ErrorTemplate="{x:Null}" 
     /> 
     ... 

La mia domanda è, quando l'utente preme il tasto CONNECT, creare la porta con tale impostazione. Non sono sicuro se sto creando il modello giusto. Nella mia classe MainWindowViewModel, ho creato una variabile Port, ma suppongo che non sia corretta.

Come posso migliorare questo codice e creare l'oggetto Port utilizzando MVVM (non ho idea di utilizzare MVVM nella barra degli strumenti utilizzando textBoxes)?

risposta

2

Vorrei cambiare i binding del ComboBox. Assocerei il ComboBox a una raccolta di porte (non ai nomi) e legheremo anche l'oggetto Selected del ComboBox a una proprietà SelectedPort sul ViewModel.

In questo modo si conosce quale porta è stata selezionata dall'utente e non è necessario interrogare la raccolta per la porta corretta.

Quando si desidera consentire all'utente di creare/configurare una nuova porta, aggiungere un oggetto Port vuoto/nuovo alla raccolta e impostare SelectedPort su questo elemento appena aggiunto.

Problemi correlati