如何在ListView中将两列的值连接为一



我有一个.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>

描述设备名称都是ModelClass的一部分。在我的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,而不是两个单独的列。我在这里面临的问题是设备名称和描述。尽管它们都显示不同的值,但它们不是我可以将它们合并并显示为单个列的一种方式吗???您可能会注意到.xaml文件中的另一列,但我想在listView中的单个列中显示(连接)这两列。我该怎么做?

请帮忙!!

使用具有格式字符串的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(轻松)使用它,您必须像上面的示例中那样指定内容。

的两种方法

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

public string DescName 
{
get 
{
return Description + " " + Name;
}
{
<GridViewColumn Width="300" Header="Name" DisplayMemberBinding="{Binding DescName}" />

或者使用多值转换器

MultiBinding.转换器

将提供并举例说明。

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

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

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

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

然后进入GridView.Column并使用:

DisplayMemberBinding="{Binding DeviceDesc}" 

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

最新更新