0

好吧,我尽力了,但看起来我需要帮助。我的 xaml 文件中有一个文本框、一个列表视图和一个按钮。Listview 有两列:Devicename 和 DeviceAddress。我已经完成了列表视图和文本框的绑定,每当我在列表视图(I2CDeviceList)中选择一个项目时,设备地址(第二列)都会显示在我的文本框中。

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为我提供了文本框中的设备地址。

现在我的视图模型具有按钮和文本框的属性,并具有以下方法,当单击按钮时会调用该方法:

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. 当我同时输入Text="{Binding SelectedItem.I2CDeviceAddress, Path=AddressMessage, Mode=TwoWay, ElementName=I2cDeviceList}"时,列表视图中的搜索地址不会出现在我的文本框中。我删除Path=AddressMessage, Mode=TwoWay,的那一刻,它工作正常。如何确保两者都能顺利工作?他们是否有任何其他方式可以从列表视图中获取所选项目并将其显示在我的文本框中?

  2. 通过使用字符串strValue = AddressMessage; 我正在尝试将 AddressMessage 的内容保存在字符串中,但是当我调试代码时,即使我的文本框中有“0x23”(硬编码),它也总是显示“null”。因此,我收到以下错误:对象引用未设置为对象的实例。if条件的开头。

我尽力了,但它没有发生。我错过了什么吗?

4

1 回答 1

1

首先,不需要有单独的 AddressMessage 属性。可以使用 SelectedI2CDeviceList 来完成。但是,如果您想使用它,可以通过以下更改来实现 -

当列表视图的选定项更改时设置 AddressMessage 属性

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

还将文本框的绑定更改为以下之一:

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

因此,每当列表视图的选定项目发生更改时,它将设置文本框的内容,并且当正确设置 AddressMessage 属性时,您希望获得第二个问题。

希望这可以帮助。

于 2012-10-08T07:52:43.970 回答