2012-09-27 46 views
0

我有一个.xaml文件,它有一个列表视图。列表视图具有其内以下列方式结合2项:如何将两列的值连接到一个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.In我ViewModel类的一部分,我能够从提取设备名称以及说明我连接的硬件。

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()返回我设备名和说明。 U可以注意到上面的DeviceList = ComDeviceManagement.FindDevices(),它表示描述和名称都存在于列表中。

一切工作正常。但我基本想要的是在一列中显示Devicename和Description,而不是两列。那么我在这里面临的问题是Devicename和Description。即使他们都显示不同的值,是不是他们的方式,我可以协调他们,并显示两个值到一个单一的列?您可能会注意到.xaml文件中的另一列,但我想在listView的单个列中显示(连接)这两个列。 我该怎么做?

请帮忙!!

+0

新列是否可编辑? –

+0

那么我在这里面临的问题是Devicename和Description。即使他们都显示不同的值,是不是他们的方式,我可以concatinate他们并显示这些值到一个单一的列? –

+0

为什么不让一个属性内在地协调他们,并将其绑定到一列? – Vale

回答

4

两种方法

在ComDeviceInfo类只想补充一点,串接

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

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

属性或使用多值转换器将提供

MultiBinding.Converter

和榜样。

+0

嘿嘿,你的第一个方法似乎很容易,你可以详细说明一下吗?就像我如何在我的视图模型中访问每个描述和名字一样,Descname必须绑定一些东西在xaml等....你可以提供一个示例代码pls?:) –

+0

我确实提供了示例代码。 – Paparazzi

+0

砰:) :)谢谢布拉姆:) –

4

使用带有格式字符串的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使用它(很容易),您必须指定上面的示例中的内容。

+0

这是非常整洁:-) – AlSki

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; } 
} 
+0

^我没有使用STRING。我正在使用ComDFeviceInfo从模型类中检索名称和描述。任何其他方式? :) –

+0

数据的存储位置并不重要。 – AlSki

+0

U rock \ m /它的工作:) –

0

如果你正在使用LINQ查询来获取你的数据,你可以这样做:

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

listview.ItemsSource = query; 

然后进入GridView.Column及用途:

DisplayMemberBinding="{Binding DeviceDesc}" 

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

相关问题