WinUI3中DynamicGrid内DeleteCommand绑定失效问题求助
解决DynamicGrid中DeleteCommand绑定为null的问题
问题根源
你直接给模板加载的元素设置DataContext = item.value,覆盖了元素原本的上下文,导致ElementName=iavpcUserControl的绑定无法正确解析:
LoadContent()生成的元素此时还未加入页面视觉树,ElementName绑定依赖视觉树上下文查找目标控件,自然无法定位到iavpcUserControl;- 直接设置DataContext后,绑定的查找路径被限定在
File_Model实例中,而该实例并没有DeleteSelectedFileCommand。
反观ListView作为内置控件,它通过ItemContainer管理模板元素的上下文,保留了父级绑定上下文,所以ElementName绑定能正常工作。
解决方案
不要直接赋值DataContext,改用绑定方式设置,确保元素加入视觉树后绑定能正确解析:
foreach (var item in items.Select((value, i) => new { i, value })) { var element = this.ItemTemplate?.LoadContent() as FrameworkElement; if (element != null) { Grid.SetColumn(element, (Int32)Math.Ceiling((Double)(item.i % columnCount))); Grid.SetRow(element, (Int32)Math.Ceiling((Double)(item.i / columnCount))); // 用绑定替代直接赋值DataContext element.SetBinding(FrameworkElement.DataContextProperty, new Binding { Source = item.value }); grid.Children.Add(element); } }
额外优化建议
- 确认
iavpcUserControl的x:Name在页面中唯一且无拼写错误; - 如果上述方法仍不生效,可改用
RelativeSource绑定替代ElementName,这种方式不依赖元素名称,可靠性更高:
将DeleteCommand="{Binding DataContext.DeleteSelectedFileCommand, RelativeSource={RelativeSource AncestorType={x:Type local:你的页面类型}}}"local:你的页面类型替换为你当前页面的实际类型。
内容的提问来源于stack exchange,提问作者Jozef
相关产品推荐
相关产品推荐

