2011-10-09 58 views
6

我正在使用串口創建一個項目。 我正在練習使用MVVM模型。我需要設置串口,所以我使用的是一個工具欄。如何在使用MVVM模式時實現工具欄?

這是我的模型:

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 
} 

然後,我有一個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}" 
     /> 
     ... 

我的問題是,當用戶按下連接按鈕,創建與設置的端口。 我不確定我是否創建了正確的模型。在我的類MainWindowViewModel中,我創建了一個Port變量,但我想這是不正確的。

如何改進此代碼並使用MVVM創建Port對象(我不知道在使用TextBoxes的工具欄中使用MVVM)?

回答

2

我會改變組合框的綁定。我會將ComboBox綁定到端口集合(不是名稱),並將ComboBox的SelectedItem綁定到ViewModel上的SelectedPort屬性。

這樣你就知道用戶已經選擇了哪個端口,並且沒有必要爲集合查詢正確的端口。

如果您想允許用戶創建/配置新端口,只需向集合中添加一個空的/新的端口對象,並將SelectedPort設置爲這個新添加的項目。