.NET 4.7.1 WPF(MahApps 1.6.1.4)运行时HamburgerMenu图标绑定失败
问题分析
你遇到的情况很典型:设计器能正确识别Image属性(因为设计时Visual Studio会优先使用UserControl的DataContext),但运行时HamburgerMenuIconItem的DataContext发生了变化,导致ImageBrush的ImageSource绑定找不到对应的Image属性。
解决方案
方法1:使用RelativeSource指定绑定源
通过RelativeSource向上查找UserControl,明确绑定的DataContext是UserControl的ViewModel:
<controls:HamburgerMenuIconItem.Icon> <Ellipse> <Ellipse.Fill> <ImageBrush ImageSource="{Binding DataContext.Image, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" /> </Ellipse.Fill> </Ellipse> </controls:HamburgerMenuIconItem.Icon>
这样绑定会跳过当前HamburgerMenuIconItem的DataContext,直接使用父级UserControl的DataContext里的Image属性。
方法2:给UserControl设置x:Name,通过ElementName绑定
先给你的UserControl命名,比如:
<UserControl x:Class="YourNamespace.YourControl" x:Name="RootControl">
然后在绑定里指定ElementName:
<controls:HamburgerMenuIconItem.Icon> <Ellipse> <Ellipse.Fill> <ImageBrush ImageSource="{Binding DataContext.Image, ElementName=RootControl}" /> </Ellipse.Fill> </Ellipse> </controls:HamburgerMenuIconItem.Icon>
这种方式更直观,明确指定绑定的源是你的UserControl。
方法3:检查HamburgerMenu的ItemsSource设置
如果你给HamburgerMenu的ItemsSource绑定了一个集合,那么每个HamburgerMenuIconItem的DataContext会自动设置为集合里的项。这种情况下,你需要确保集合里的每个项都包含Image属性,或者调整绑定路径到集合项的对应属性。比如如果集合项是MenuItemViewModel,里面有IconImage属性,那绑定应该写成:
<ImageBrush ImageSource="{Binding IconImage}" />
但根据你的描述,设计时能跳转到UserControl的ViewModel属性,说明你原本希望绑定到UserControl的ViewModel,所以前两种方法更适合你的场景。
验证小贴士
运行前可以查看Visual Studio的输出窗口(切换到“调试”输出分类),里面会显示详细的绑定错误日志,能帮你快速确认是不是DataContext继承的问题。
内容的提问来源于stack exchange,提问作者Werner

