我的主窗口中有一个tabControl,还有一个正在工作的LeftWindowCommand
<Controls:MetroWindow.LeftWindowCommands>
<Controls:WindowCommands >
<Button x:FieldModifier="public" x:Name="btnOpenBanMenu" Click="btnOpenBanMenu_Click">
<StackPanel Orientation="Horizontal">
<Rectangle Width="20"
Height="20"
Fill="{Binding Foreground, RelativeSource={RelativeSource AncestorType={x:Type Button}}}">
<Rectangle.OpacityMask>
<VisualBrush Stretch="Fill" Visual="{StaticResource bans}" />
</Rectangle.OpacityMask>
</Rectangle>
<TextBlock Margin="4 0 0 0"
VerticalAlignment="Center"
Text="Bans"/>
</StackPanel>
</Button>
</Controls:WindowCommands>
</Controls:MetroWindow.LeftWindowCommands>
这一切都很好。但现在我想使用LeftWindowCommand作为一个“子菜单栏”,所以如果你改变了选定的标签,LeftWindowCommands-Bar也应该改变那里的项目和按钮后面的动作。我已经玩了周围的可见性,但这不是我想要的。
为了更好地理解:
你看到的项目“赠品,Losung,歌曲请求”。这些项目是在我的TabControl。
现在我想改变“子菜单”-项目(在图片中描述),当我选择一个不同的标签,然后赠品。
有人能指导我怎么做吗?
编辑2:最后它与MVVM一起工作,但我仍然不知道如何绑定LeftWindowCommands。
主要型号:
class MainModel
{
public string Header { get; set; }
public MahApps.Metro.Controls.MetroContentControl Content { get; set; }
public MahApps.Metro.Controls.WindowCommands LeftWindowCommands { get; set; }
}
主视图模型:
class MainViewModel : BaseViewModel
{
private ObservableCollection<Model.MainModel> _tabItems;
public ObservableCollection<Model.MainModel> tabItems
{
get { return _tabItems; }
set
{
_tabItems = value;
OnPropertyChanged("tabItems");
}
}
public MainViewModel()
{
_tabItems = new ObservableCollection<Model.MainModel>()
{
new Model.MainModel
{
Header = "Giveaway",
Content = new Controls.ucGiveaway(),
LeftWindowCommands = LeftWindowCommandsGiveaway()
},
... etc
};
}
private MahApps.Metro.Controls.WindowCommands LeftWindowCommandsGiveaway()
{
MahApps.Metro.Controls.WindowCommands command = new MahApps.Metro.Controls.WindowCommands();
command.Items.Add(
new Button { Content = "MyButton #1", Foreground = Brushes.Red });
return command;
}
}
数据上下文:
<Controls:MetroWindow.DataContext>
<ViewModels:MainViewModel/>
</Controls:MetroWindow.DataContext>
选项卡控件:
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock
Text="{Binding Header}" />
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<Controls:MetroContentControl
Content="{Binding Content}" />
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
这个工作。设计器显示所有的标签和内容。我如何绑定窗口命令?我想这样的东西:
<Controls:MetroWindow.LeftWindowCommands>
<Controls:WindowCommands ItemsSource="{Binding LeftWindowCommands}">
</Controls:WindowCommands>
</Controls:MetroWindow.LeftWindowCommands>
此外,我希望能够在我的MainViewModel中添加多个按钮。
private MahApps.Metro.Controls.WindowCommands LeftWindowCommandsGiveaway()
{
MahApps.Metro.Controls.WindowCommands command = new MahApps.Metro.Controls.WindowCommands();
command.Items.Add(
new Button { Content = "MyButton #1", Foreground = Brushes.Red });
command.Items.Add(
new Button { Content = "MyButton #2", Foreground = Brushes.Red });
return command;
}
2条答案
按热度按时间o2gm4chl1#
理想情况下,您会使用Bindings,但由于您使用的是代码隐藏,这里有一个简单的解决方案(如果您想让它适应MVVM这样的模式,这取决于您):
这段代码的基本功能是:
UIElements
的List
包含所有子菜单(它们可以是任何东西,从简单的Button
到充满元素的StackPanel
)。***重要提示:**列表中的项目必须排序,这意味着索引0 =〉选项卡索引0的子菜单。
WindowCommands
中有一个TransitioningContentControl
,负责包含子菜单。List
的n位置加载到TransitioningContentControl
(n是TabControl
的所选索引)。输出:
下面是我在示例中使用的代码,您可以对其进行修改:
代码隐藏:
窗口:
你会需要这个:
如果你试图适应MVVM,并有任何麻烦,我在这里帮助。
agxfikkp2#
我认为问题在于您将WindowCommands.ItemSource绑定到WindowCommands对象,而不是控件元素的集合(如按钮、文本块)
下面是我解决方案:
MainWindow.xaml
MainModel.cs
MainWindow.xaml.cs
TabCustomItem.cs
通过生成更通用的控件集合,您可以将任何控件添加到窗口命令。我不能在数据绑定中引用选定的选项卡,这就是为什么我使用事件处理程序将当前控件集合分配给我绑定到的数据(变量Buttons)
也许重写一个tabcontrol并添加一个绑定变量会使它变得简单(在数据绑定中引用该变量)