【问题标题】:Failing To Bind Multiple UI Components in WPF在 WPF 中绑定多个 UI 组件失败
【发布时间】:2012-10-08 06:56:12
【问题描述】:

好的,我已尽力而为,但看起来我需要帮助。我的 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 的内容保存在字符串中,但是当我调试我的代码时,它总是显示“null”,即使我有“ 0x23"(硬编码)在我的文本框中。因此,我收到以下错误:Object reference not set to an instance of an object.if 条件的开头。

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

【问题讨论】:

    标签: c# wpf mvvm binding


    【解决方案1】:

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

    当listview的选中项改变时设置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 属性时,您希望获得第二个问题。

    希望这会有所帮助。

    【讨论】:

    • 我错过了从我的示例代码中删除 ElementName=root。现在删除它,它应该可以工作。
    • 你去 :) 知道了,伙计。我很感激:)
    猜你喜欢
    • 1970-01-01
    • 2010-11-29
    • 2015-01-23
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多