gpt4 book ai didi

c# - MahApps Metro HamburgerMenu 绑定(bind)不工作

转载 作者:行者123 更新时间:2023-12-04 17:48:13 27 4
gpt4 key购买 nike

我不太确定这是不是问这个问题的最佳地点,但我想我会试一试。

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

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

[示例 View :

这张图片显示了我为展示示例而制作的测试窗口模型。标题和两个文本框都绑定(bind)到“MyTitle”。如您所见,HamburgerMenu 中的那个不起作用。

我也尝试过将 ViewModel 绑定(bind)到 HamburgerMenu 控件,但没有成功。我想它必须绑定(bind)到 HamburgerMenu ControlTemplate 中的“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>

代码隐藏和 View 模型

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 中描述的解决方案解决它.

因为 HamburgerMenuGlyphItem 不会成为可视化或逻辑树的一部分,所以 DataContext 没有绑定(bind)祖先。即,您的绑定(bind)没有可绑定(bind)的源。

在资源中创建一个助手对象的实例,并使用 StaticResource 将绑定(bind)源显式设置到它:

<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):

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));
}

关于c# - MahApps Metro HamburgerMenu 绑定(bind)不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47293523/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com