2012-10-08 16 views
0

好吧我盡我所能,但看起來像我需要幫助。我在我的xaml文件中有一個文本框,一個列表視圖和一個按鈕。 Listview有兩列:Devicename和DeviceAddress。我以這種方式完成了listview和textbox的綁定,只要我在listview(I2CDeviceList)中選擇一個項目,設備地址(第二列)就會顯示在我的文本框中。未能綁定WPF中的多個UI組件

XAML:

<TextBox PreviewTextInput="AddressBox_PreviewTextInput" Name="AddressI2C" Text="{Binding SelectedItem.I2CDeviceAddress, Path=AddressMessage, Mode=TwoWay, ElementName=I2cDeviceList}" /> 
<Button Content="I2C Read" Command="{Binding Path=I2CReadCommand}" Name="button9" /> 

<ListView Grid.Column="0" ItemsSource="{Binding I2CDeviceList}" SelectedItem="{Binding SelectedI2CDeviceList, Mode=TwoWay}" Height="100" HorizontalAlignment="Stretch" Name="I2cDeviceList" VerticalAlignment="Stretch" Width="Auto" > 
         <ListView.View> 
          <GridView> 
           <GridViewColumn Header="I2C Device" Width="Auto" DisplayMemberBinding="{Binding I2CDevName}" /> 
           <GridViewColumn Header="I2C Device Address" Width="Auto" DisplayMemberBinding="{Binding I2CDeviceAddress}" /> 
          </GridView> 
         </ListView.View> 
        </ListView> 

因此,使用SelectedItem.I2CDeviceAddress讓我在我的文本框的deviceaddress。

現在我的視圖模型有按鈕和文本框的屬性,並具有以下方法,該方法被調用按鈕被點擊時:

public void I2CReadCommandExecuted() 
{ 
    ReadMessage = string.Empty; 
    Byte[] buffer = new Byte[512]; 
    int address; 

    string strValue = AddressMessage; 
    if (strValue.StartsWith("0x")) 
    { 
     strValue = strValue.Remove(0, 2); 
     address = Convert.ToInt32(strValue); 
     mComm.setAddress(address); 
    } 
} 

// This is for textBox 
private string _AddressMessage = string.Empty; 
public string AddressMessage 
{ 
    get 
    { 
     return _AddressMessage; 
    } 
    set 
    { 
     _AddressMessage = value; 
     NotifyPropertyChanged("AddressMessage"); 
    } 
} 

// Property for ListView 
public ObservableCollection<I2CModel> I2CDeviceList 
    { 
     get { return _I2CDeviceList; } 
     set 
     { 
      _I2CDeviceList = value; 
      NotifyPropertyChanged("I2CDeviceList"); 
     } 
    } 

    // Property for Selected Item in ListView 
    private I2CModel _selectedI2CDeviceList; 
    public I2CModel SelectedI2CDeviceList 
    { 
     get { return _selectedI2CDeviceList; } 
     set 
     { 
      _selectedI2CDeviceList = value; 
      NotifyPropertyChanged("SelectedI2CDevSize"); 
     } 
    } 

基本上我必須從值中刪除0X和存儲我的整數變量中的十六進制值。

在這裏,我面臨兩個問題:

  1. 當我把兩個文本= 「{結合SelectedItem.I2CDeviceAddress,路徑= AddressMessage,模式=雙向,的ElementName = I2cDeviceList}」的seelcted來自listview的地址不會出現在我的文本框中。我刪除的時刻Path = AddressMessage,Mode = TwoWay,,它工作正常。如何確保他們兩個工作順利?他們有什麼其他方式可以從列表視圖中獲取所選項目並將其顯示在我的文本框中?

  2. 通過使用字符串strValue = AddressMessage;我試圖保存字符串中的AddressMessage的內容,但是當我調試我的代碼時,即使在我的文本框中有「0x23」(硬編碼),它仍會顯示「null」。由於這個原因,我得到以下錯誤:未將對象引用設置爲對象的實例。如果條件的開頭。

我盡我最好的水平,但沒有發生。我錯過了什麼嗎?

回答

1

首先沒有必要有單獨的AddressMessage屬性。它可以使用SelectedI2CDeviceList完成。但仍然,如果你想使用它,它可以通過改變以下來實現 -

當列表視圖中選擇的項目改變

public I2CModel SelectedI2CDeviceList 
     { 
      get { return _selectedI2CDeviceList; } 
      set 
      { 
       _selectedI2CDeviceList = value; 
       AddressMessage = _selectedI2CDeviceList.I2CDeviceAddress; 
       NotifyPropertyChanged("SelectedI2CDevSize"); 
      } 
     } 

而且改變文本框的結合

集AddressMessage財產低於一:

<TextBox 
       Name="AddressI2C" 
       Text="{Binding Path=AddressMessage, Mode=TwoWay}" /> 

因此,無論何時listview的選定項目更改它將設置文本框的內容,並且當AddressMessage屬性正確設置您想要第二個問題。

希望這會有所幫助。

+0

我錯過了從我的示例代碼中刪除ElementName = root。現在刪除它,它應該工作。 – user1246682

+0

你去了:)明白了夥伴。我很感激 :) – StonedJesus