我不太确定这是否是最好的问题,但我想我会试一试。
我正在尝试使用MahApps Metro UI Toolkit在我的应用程序中实现汉堡菜单,该工具包在我制作的测试窗口中运行良好。于是我开始转向使用View Model的主窗口。
问题是,HamburgerMenu中的任何绑定根本不起作用,但在HamburgerMenu控件之外工作正常。
[示例视图:
此图显示了我用来显示示例的测试窗口模型。标题和两个文本框都绑定到“MyTitle”。如您所见,HamburgerMenu中的那个不起作用。
我已经尝试将ViewModel绑定到HamburgerMenu控件,但这不起作用。我想它必须绑定到HamburgerMenu ControlTemplate中的“TheContentGrid”或“TheContent”控件,但是不能从Code Behind访问这些控件。
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="" 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>
代码背后&amp;查看模型
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";
}
}
如果需要更多信息,请与我们联系。
答案 0 :(得分:0)
您应该解决实现INotifyPropertyChanged接口的问题。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
<body>
<div class="container-fluid bg">
<nav class="navbar">
<div class="container-fluid">
<ul class="nav navbar-nav">
<li class="active"><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Education</a></li>
<li><a href="#">Contact</a></li>
</ul>
</div>
</nav>
</div>
</body>
问题是您没有通知您的UI第一个文本框的Text属性已更改。 UI在视图模型之前初始化,这就是您看到空文本框
的原因答案 1 :(得分:0)
也许我的回答对您来说有点晚了,但可能会帮助其他人。 我自己偶然发现了这个问题,可以使用此answer中描述的解决方案来解决。
由于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)的代码:
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));
}