如何绑定到父集合MVVM WPF中的特定项

时间:2016-08-19 12:43:33

标签: c# wpf linq xaml mvvm

我正在制作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

并创建了这个新类的集合以绑定到详细信息,其中版本返回正确的版本,取自详细信息。这似乎是最好的解决方案,而且很容易实现。

1 个答案:

答案 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()

    }

}

并创建了这个新类的集合以绑定到详细信息和版本,其中版本返回从详细信息中获取的正确版本。这似乎是最好的解决方案,而且很容易实现。