我正在制作MVVM WPF程序,并希望将子网格绑定到父集合中的单个项目,我正在使用telerik(RadGridView)。
情况如下:
public class ItemDetails
{
Item item {get; set;}
string version {get; set;}
}
public class Item
{
ObservableCollection<ItemVersion> itemVersions { get; set;}
}
public class ItemVersion
{
string version {get; set;}
ObservableCollection<ItemVersionSubItemVersion> subItemVersions {get; set;}
}
public class ItemVersionSubItemVersion
{
ItemVersion parentItemVersion {get; set;}
ItemVersion subItemVersion {get; set;}
}
我绑定一个ObservableCollection&lt; ItemDetails&GT;在我的RadGridView中,根据ItemDetails中请求的版本,我想要显示具有正确版本的ItemVersion的所有SubItemVersion成员(版本将始终是唯一的,如果没有可用的,则将创建一个带有空ObservableCollection的新ItemVersion&lt;子项目&GT;)
我进行这种半工作的唯一方法是首先在Item中显示所有ItemVersions然后转到SubItems,但是这显示了不相关的ItemVersions,而不仅仅是我需要的那个。所以我想跳过链中的链接,可以这么说,直接去SubItemVersions。
我想知道是否有人知道如何能够从xaml中的集合中选择某个项目,有点像linq查询,但是在xaml中,或者以其他方式直接转到正确的ItemVersion的SubItemVersions。
我的一些要求和想法使我很难自己提出解决方案:
整个事情需要保留在一个视图中,因此用户可以对结构保持良好的概述(SubItemVersion可以拥有自己的SubItemVersions,这可能会很快变得混乱)。
< / LI>它需要是MVVM,所以如果避免使用视图后面的代码,最好是纯xaml。
我希望如果不需要更改模型,但是,如果没有其他解决方案可用,我将别无选择。
我想改变以下内容:
public class ItemDetails
{
Item item {get; set;}
string version {get; set;}
}
为:
public class ItemDetails
{
Item item {get; set;}
ItemVersion version {get; set;}
}
但是这会添加一个已经在Item中的ItemVersions集合中的ItemVersion,所以我生成的数据超过了必要的(重复)数据,对吗?或者,这实际上是一个合适的解决方案吗?
欢迎任何想法或意见,非常感谢,如果您需要更多信息,请告诉我,以便我可以尝试提供。
编辑: 我通过创建一个包含
的新ViewModel解决了我的问题ItemVersion version
ItemDetails details
并创建了这个新类的集合以绑定到详细信息,其中版本返回正确的版本,取自详细信息。这似乎是最好的解决方案,而且很容易实现。
答案 0 :(得分:0)
我通过创建一个包含
的新ViewModel解决了我的问题import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream
import org.msgpack.core.MessagePack
import org.msgpack.core.MessageUnpacker
import java.awt.List
import java.io.*
import java.net.ServerSocket
import java.net.Socket
import java.text.SimpleDateFormat
import java.util.*
fun main(args: Array<String>) {
var fs = FileServer(1988)
fs.start()
}
class FileServer(port: Int) : Thread() {
private var ss: ServerSocket? = null
var fileRealName : String ?= null
init {
try {
ss = ServerSocket(port)
} catch (e: IOException) {
e.printStackTrace()
}
}
override fun run() {
while (true) {
try {
val clientSock = ss!!.accept()
saveFile(clientSock)
} catch (e: IOException) {
e.printStackTrace()
}
}
}
@Throws(IOException::class)
private fun saveFile(clientSock: Socket) {
var msgList = ArrayList<Any>()
val dis = DataInputStream(clientSock.inputStream)
val msgdata = ByteOutputStream()
val buffer = ByteArray(4096)
var read = 0
while (true) {
val datalen = dis.readInt() // data length
if(datalen!= null && datalen >0){
var finaldata = ByteArray(datalen)
var process = 0;
while (process <= datalen) {
read = dis.read(buffer)
if (read < 0) {
return
}
msgdata.write(buffer)
process += 4096
}
println(process.toString() + " "+ datalen.toString())
var allData = msgdata.toByteArray().slice(0..datalen).toByteArray()
unpackByte(allData)
}
}
msgdata.close()
dis.close()
}
private fun unpackByte(data:ByteArray){
var unpacker : MessageUnpacker = MessagePack.newDefaultUnpacker(data)
var fileName = unpacker.unpackString().toString()
var filesize = unpacker.unpackBinaryHeader()
var buffer = ByteArray(filesize)
unpacker.readPayload(buffer)
var fos = FileOutputStream(fileName)
fos.write(buffer)
fos.close()
unpacker.close()
}
}
并创建了这个新类的集合以绑定到详细信息和版本,其中版本返回从详细信息中获取的正确版本。这似乎是最好的解决方案,而且很容易实现。