0

わかりました、最善を尽くしましたが、助けが必要なようです。xaml ファイルにテキスト ボックス、リストビュー、ボタンがあります。Listview には、Devicename と DeviceAddress の 2 つの列があります。リストビュー(I2CDeviceList)でアイテムを選択するたびに、デバイスアドレス(2番目の列)がテキストボックスに表示されるように、リストビューとテキストボックスの両方をバインドしました。

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を使用すると、Textbox にデバイスアドレスが表示されます。

現在、ビュー モデルにはボタンとテキスト ボックスのプロパティがあり、ボタンがクリックされたときに呼び出される次のメソッドがあります。

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 を削除し、整数変数に 16 進数値を格納する必要があります。

ここで私は2つの問題に直面しています:

  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");
            }
        }

また、テキストボックスのバインドを1つ以下に変更します。

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

したがって、リストビューの選択された項目が変更されるたびに、テキストボックスのコンテンツが設定され、AddressMessageプロパティが適切に設定されると、2番目の問題が発生します。

お役に立てれば。

于 2012-10-08T07:52:43.970 に答える