如何在ListView内将两列的值连接成一列

时间:2012-09-27 12:13:59

标签: c# wpf listview mvvm

我有一个.xaml文件,其中包含listview。 Listview有两个项目,它们以下列方式绑定:

<ListView  Name="listView" ItemsSource="{Binding DeviceList}" SelectedItem="{Binding ConnectedDevice, Mode=TwoWay}" >
        <ListView.View>
            <GridView>
                <GridViewColumn Width="300" Header="Name" DisplayMemberBinding="{Binding Description}" />
                <GridViewColumn Width="240" Header="Connection Status" DisplayMemberBinding="{Binding DeviceName}" />
            </GridView>
        </ListView.View>
    </ListView>

描述 Devicename 都是ModelClass的一部分。在我的ViewModel类中,我能够从已连接的硬件中提取设备名称和描述。< / p>

    public ObservableCollection<ComDeviceInfo> DeviceList
    {
        get { return comDevices; }
        set
        {
            comDevices = value;
            NotifyPropertyChanged("DeviceList");
        }
    }

    public ComDeviceInfo ConnectedDevice
    {
        get { return connectedDevice; }
        set
        {
            connectedDevice = value;
            NotifyPropertyChanged("ConnectedDevice");
        }
    }        

    //Called Inside Constructor
    private void checkForDevicesTimer_Elapsed(Object source, ElapsedEventArgs e)
    {            
        DeviceList = ComDeviceManagement.FindDevices();            
    }

此处 ComDeviceManagement 是我的类,其中包含 FINDDevices(),它会返回devicename和description。你可以注意到上面的DeviceList = ComDeviceManagement.FindDevices(),它表示列表中存在描述和名称。

一切都很好。但我基本上想要的是在一列中显示Devicename和Description,而不是两列。我面临的问题是Devicename和Description。虽然它们都显示不同的值,但是它们不是一种可以将它们连接起来并将值显示在一个列中的方法吗?您可能会注意到.xaml文件中的另一列,但我想在listView的单个列中显示(连接)这些列。 我怎么能这样做?

请帮助!!

4 个答案:

答案 0 :(得分:5)

使用带有格式字符串的MultiBinding

<GridViewColumn>
    <TextBlock>
        <!-- the Text property is of type System.String -->
        <TextBlock.Text>
            <MultiBinding StringFormat="{0} {1}">
                <Binding Path="Description "/>
                <Binding Path="Name"/>
             </MultiBinding>
         </TextBlock.Text>
     </TextBlock> 
</GridViewColumn>

使用MultiBinding必须要理解的是,如果目标属性不是字符串,则必须提供转换器。如果是一个字符串,您只需使用格式字符串即可。

因此,在您的情况下,您不能(通过DisplayMemberBinding)轻松使用它,您必须像我上面的示例中那样指定内容。

答案 1 :(得分:4)

两种方法

在ComDeviceInfo类中,只需添加一个连接

的属性
  public string DescName 
  {
      get 
      {
           return Description + " " + Name;
      }
  {

<GridViewColumn Width="300" Header="Name" DisplayMemberBinding="{Binding DescName}" />

或使用多值转换器

MultiBinding.Converter

将提供和示例。

答案 2 :(得分:2)

我会添加一个新属性,但是当它的组件发生变化时也不要忘记更新它。

 private ComDeviceInfo _model;

 public string DeviceName
 {
     get { return _model.Name; }
     set
     {
         _model.Name = value;
         NotifyPropertyChanged("DeviceName");
         NotifyPropertyChanged("Combined");
     }
 }
 public string Description
 {
     get { return _model.Description; }
     set
     {
         _model.Description = value;
         NotifyPropertyChanged("Description");
         NotifyPropertyChanged("Combined");
     }
 } 
 public string Combined
 {
     get { return string.Format("{0} : {1}", _description, _deviceName; }
 }

答案 3 :(得分:0)

如果您使用LINQ查询来获取数据,则可以执行以下操作:

var query = from devices in DeviceList
            select new
            {.DeviceDesc = devices.device + " " devices.desc}

listview.ItemsSource = query;

然后进入GridView.Column并使用:

DisplayMemberBinding="{Binding DeviceDesc}" 

它将绑定刚刚创建的连接列。显然你需要写出正确的查询,我只是一个例子......