MahApps Metro HamburgerMenu 绑定不起作用

2024-01-11

我不太确定这是否是问这个问题的最佳地点,但我想我应该尝试一下。

我正在尝试使用 MahApps Metro UI Toolkit 在我的应用程序中实现汉堡菜单,该工具包在我制作的测试窗口中效果很好。因此,我开始转向使用视图模型的主窗口之一。

问题是,HamburgerMenu 内的任何绑定根本不起作用,但在HamburgerMenu 控件之外却可以正常工作。

[示例视图:

这张图显示了我为展示示例而制作的测试窗口模型。标题和两个文本框都绑定到“我的标题”。正如您所看到的,汉堡菜单中的菜单不起作用。

我也尝试将 ViewModel 绑定到汉堡菜单控件,但这不起作用。我想它必须绑定到汉堡菜单控件模板中的“TheContentGrid”或“TheContent”控件,但这些控件无法从隐藏代码访问。

XAML:

<Controls:MetroWindow
        ..
        Title="{Binding MyTitle}"
        ..>
    <Grid>
        <Grid.Resources>
            <DataTemplate x:Key="MenuItemTemplate" DataType="{x:Type Controls:HamburgerMenuGlyphItem}">
                <Grid Height="48">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="48" />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" FontSize="16" HorizontalAlignment="Center" VerticalAlignment="Center" FontFamily="Segoe MDL2 Assets" Text="{Binding Glyph}" />
                    <TextBlock Grid.Column="1" VerticalAlignment="Center" FontSize="16" Text="{Binding Label}" />
                </Grid>
            </DataTemplate>
        </Grid.Resources>

        <TextBox Text="{Binding MyTitle}" HorizontalAlignment="Right" />

        <Controls:HamburgerMenu Margin="0 30 0 0"
            SelectedIndex="0"
            x:Name="HamburgerMenuControl"
            ItemTemplate="{StaticResource MenuItemTemplate}"
            OptionsItemTemplate="{StaticResource MenuItemTemplate}"
            ItemClick="HamburgerMenuControl_OnItemClick"
            OptionsItemClick="HamburgerMenuControl_OnItemClick"
            DisplayMode="CompactOverlay">
            <!--  Items  -->
            <Controls:HamburgerMenu.ItemsSource>
                <Controls:HamburgerMenuItemCollection>
                    <Controls:HamburgerMenuGlyphItem Glyph="&#xE80F;" Label="Home">
                        <Controls:HamburgerMenuGlyphItem.Tag>
                            <Grid>
                                <TextBox Text="{Binding MyTitle}" HorizontalAlignment="Center" VerticalAlignment="Top"/>

                                <TextBlock Text="Home View" FontSize="32" HorizontalAlignment="Center" VerticalAlignment="Center" />
                            </Grid>
                        </Controls:HamburgerMenuGlyphItem.Tag>
                    </Controls:HamburgerMenuGlyphItem>
                </Controls:HamburgerMenuItemCollection>
            </Controls:HamburgerMenu.ItemsSource>

            <!--  Content  -->
            <Controls:HamburgerMenu.ContentTemplate>
                <DataTemplate DataType="{x:Type Controls:HamburgerMenuItem}">
                    <Grid x:Name="TheContentGrid">
                        <ContentControl x:Name="TheContent" Content="{Binding Tag}" />
                    </Grid>
                </DataTemplate>
            </Controls:HamburgerMenu.ContentTemplate>
        </Controls:HamburgerMenu>
    </Grid>
</Controls:MetroWindow>

代码隐藏和视图模型

public partial class WindowTest : MetroWindow
{
    public WindowTest()
    {
        InitializeComponent();

        DataContext = new TestViewModel();
    }

    private void HamburgerMenuControl_OnItemClick(object sender, ItemClickEventArgs e)
    {
        HamburgerMenuControl.Content = e.ClickedItem;
        HamburgerMenuControl.IsPaneOpen = false;
    }
}

public class TestViewModel : BindableBase
{

    private string myTitle;
    public string MyTitle
    {
        get { return myTitle; }
        set { SetProperty(ref myTitle, value); }
    }

    public TestViewModel()
    {
        MyTitle = "Title from VM";
    }
}

如果需要更多信息,请告诉我。


也许我的回答对你来说有点晚了,但可能对其他人有帮助。 我自己偶然发现了这个问题,并且可以使用本文中描述的解决方案解决它answer https://stackoverflow.com/questions/15494226/cannot-find-source-for-binding-with-reference-relativesource-findancestor.

Because HamburgerMenuGlyphItem不会成为视觉或逻辑树的一部分,没有绑定祖先DataContext。即您的绑定没有可绑定的源。

在资源中创建辅助对象的实例,并使用显式设置绑定源StaticResource:

<Controls:MetroWindow.Resources>
    <local:BindingProxy x:Key="Proxy" Data="{Binding}" />
</Controls:MetroWindow.Resources>
...
    <Controls:HamburgerMenuGlyphItem.Tag>
        <Grid>
            <TextBox Text="{Binding Data.MyTitle, Source={StaticResource Proxy}}" />
        </Grid>
    </Controls:HamburgerMenuGlyphItem.Tag>

这是辅助对象的代码(source http://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/):

public class BindingProxy : Freezable
{ 
    protected override Freezable CreateInstanceCore()
    {
        return new BindingProxy();
    }

    public object Data
    {
        get { return (object)GetValue(DataProperty); }
        set { SetValue(DataProperty, value); }
    }

    public static readonly DependencyProperty DataProperty =
        DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MahApps Metro HamburgerMenu 绑定不起作用 的相关文章

随机推荐

  • 哪一段代码性能更好?

    我正在审查一些代码 用于将一些文本转换为MD5 Hash 效果很好 它用于创建一个MD5Hhash for a 头像 头像 这里是 static MD5CryptoServiceProvider md5CryptoServiceProvid
  • django 从连接到任何网络的任何计算机访问本地主机

    我有一个 Django 项目 正在 localhost 8000 上运行 并且运行良好 现在我希望它可以从连接到其他网络的任何计算机进行访问 做了一些谷歌 我发现我可以通过从路由器设置端口转发来做到这一点 我有一个 tplink 路由器 我
  • 寻找具有选择条件的最便宜的物品组合

    假设我有 3 个特定商品的卖家 每个卖家存储的此类物品数量不同 该商品也有不同的价格 Name Price Units in storage Supplier 1 17 1 Unit Supplier 2 18 3 Units Suppli
  • AWS TimeStream:超过一天的记录将被拒​​绝

    我在AWS TimeStream中创建了一个数据库表 其内存保留期为7天 但是 当我尝试上传 3 天前的数据时 它将被拒绝 似乎只接受超过 24 小时的数据 2020 10 26T13 43 33 244 01 00 Rejected a
  • 如何从 python 脚本在 azure devops 管道中生成合理的错误消息

    我在构建管道中使用 python 对拉取请求运行一些检查 当检查失败时 我使用sys exit reason 退出脚本 这可行 但输出没有帮助 PR 页面中显示的内容如下 进程 C hostedtoolcache windows Pytho
  • JavaScript 复制到剪贴板不起作用

    我的脚本中有一个函数给我一个错误 该功能的目的是通过 onClick 事件从静态面板 不是文本框或输入 复制文本 未捕获的类型错误 copyText select 不是函数 我想要的是让用户能够单击文本并将其复制到剪贴板 也许你可以提供更好
  • 当现有的 Excel 文件在桌面上**打开**时,是否可以写入该文件?

    我正在创建一个将数据写入现有 Excel 文件的代码 仅当文件关闭时它才会读 写文件 如果我尝试在桌面上打开该文件时写入该文件 它将不会更改或保存该文档 当代码运行之前或运行期间打开 Excel 文件时 我也无法关闭工作簿 使用 close
  • from ... import * with __import__ 函数 [重复]

    这个问题在这里已经有答案了 可能的重复 from import x using import https stackoverflow com questions 8408373 from import x using import 一个人如
  • 如何让 Redshift/Postgresql LAG 窗口函数有选择地排除记录?

    我在 Redshift 中有这个表 我正在尝试为以下数据集编写查询 对于诸如 row 3 之类的 续订成功 且前面有 子成功 的项目 我想将它们标记为 is first renewal true 但它们前面可能有任意数量的 RENEWAL
  • 词袋训练样本

    我已经实施了 Bag Of Words 一切都很顺利 但是 我对一些步骤以及如何实施感到困惑 我可以创建弓描述符作为词袋中创建样本的最后一步 如此处所示bowDE compute img keypoints bow descriptor 问
  • 找不到 Gmail 的 Developer.gserviceaccount

    我正在阅读有关设置对谷歌服务器发布请求的访问权限的谷歌文档 将 OAuth 2 0 用于服务器到服务器应用程序 https developers google com identity protocols OAuth2ServiceAcco
  • 为什么谷歌地理编码器给出的地图搜索结果不同?

    例如 使用以下命令搜索 36 High Street Clapham London SW4 7UR geocoder http gmaps samples googlecode com svn trunk geocoder singlege
  • 使用 css / php styleswitcher 在移动视图和标准视图之间来回切换

    有问题的网站在这里 http autisticadovcacy uniongraphics org http autisticadovcacy uniongraphics org 我最初设计这个时使用一个 css 文件作为默认 打印和移动样
  • 任务“app:transformClassesWithInstantRunForDebug”执行失败

    如果我想运行我的应用程序 我会收到此错误 错误 任务 app transformClassesWithInstantRunForDebug 执行失败 java lang NullPointerException 无错误消息 我的 Gradl
  • hardwareAccelerated="true" 与部分绘图

    我花了几天时间才弄清楚原因invalidate Rect dirty 无法在较新的设备上设置正确的剪辑 问题是hardwareAccelerated true 默认设置 当我设置这个hardwareAccelerated false 我把正
  • javascript / d3 - 将参数传递给函数

    我正在使用一个名为 d3 的 JavaScript 库来对对象执行一些动画 在每个动画结束时 我想调用一个函数 该函数从调用动画的对象传递数据 但它不起作用 我该如何实现这个目标 这是我的代码 function selectArcs d3
  • mod_fastcgi空闲超时不起作用

    我正在使用 Apache mod fastcgi php fpm 我正在尝试解析大文件并在 php 脚本中将 max execution time 设置为 0 但脚本在 30 秒后失败 并在错误日志中显示消息 FastCGI 与服务器 us
  • C 的最小哈希函数?

    我不能使用 boost hash 因为我必须坚持使用 C 而不能使用 C 但是 我需要对大量 10K 到 100k 令牌字符串 5 到 40 字节长度 进行哈希处理 以便在这些字符串中进行搜索速度最快 MD5 SHA1 或任何长哈希函数对于
  • 使用 Pandas MultiIndex 选择多行分层 DataFrame

    我有一个具有 3 个级别的 MultiIndex 的 Pandas DataFrame 假设我有以下数据 df pd DataFrame ColB A1 B1 1 cb1 A1 B1 2 cb2 A1 B2 1 cb3 A1 B2 2 cb
  • MahApps Metro HamburgerMenu 绑定不起作用

    我不太确定这是否是问这个问题的最佳地点 但我想我应该尝试一下 我正在尝试使用 MahApps Metro UI Toolkit 在我的应用程序中实现汉堡菜单 该工具包在我制作的测试窗口中效果很好 因此 我开始转向使用视图模型的主窗口之一 问