UWP项目中如何为已存在的Room对象设置Projector属性
如何直接修改UWP项目中已存在Room对象的Projector属性
嘿,我明白你的问题了——你现在用Rooms.Insert(1, new Room{ Projector = Visibility.Collapsed });的方式会创建一个全新的Room实例,而不是修改列表里已有的那个对象。要直接操作已存在的Room,核心是先定位到目标实例,再直接给属性赋值,下面分两种场景给你解决方案:
场景1:在创建Room对象时就设置Projector属性(对应你的补充代码逻辑)
看你提供的补充代码,当前逻辑是先插一个空的Room,再添加完整的Room,这明显逻辑错位了。正确的做法是先创建完整的Room实例,在遍历属性的时候直接修改这个实例的Projector,最后再加入列表:
foreach (var room in data) { // 先初始化当前Room的所有基础属性 var currentRoom = new Room { RoomID = room.id, RoomName = room.name, FrontImage = Img1, Seats = room.seats, Note = "Lorem ipsum dolor sit amet, co", // 先给Projector一个默认值,比如Visible Projector = Visibility.Visible }; // 遍历房间属性,找到目标属性后修改Projector foreach (var attri in room.roomAttributes) { if (attri.id == 1) { currentRoom.Projector = Visibility.Collapsed; // 找到后可以跳出循环,节省性能 break; } } // 把配置好的Room添加到列表 Rooms.Add(currentRoom); }
这样你就不会创建多余的Room对象,而是直接在同一个实例上修改属性。
场景2:修改Rooms列表中已存在的Room对象
如果你的需求是列表里已经有这个Room了,之后要修改它的Projector,那你需要通过唯一标识(比如RoomID)找到对应的实例,再赋值:
// 假设你要修改RoomID为"your-target-room-id"的对象 var targetRoom = Rooms.FirstOrDefault(r => r.RoomID == "your-target-room-id"); if (targetRoom != null) { // 直接修改属性 targetRoom.Projector = Visibility.Collapsed; }
这里用FirstOrDefault是为了避免找不到对象时触发空引用异常,一定要先判断targetRoom不为null再操作。
为什么你的原代码不对
你原来的代码中,当attriId == 1时插入的是一个只有Projector属性的空Room,之后又添加了一个完整的Room——这会让Rooms列表里出现两个无关的Room实例,完全不是你想要的修改已存在对象的效果。通过先创建实例再修改属性的方式,就能直接操作你需要的那个对象,不会产生冗余数据。
内容的提问来源于stack exchange,提问作者luddep
相关产品推荐
相关产品推荐

