我正在尝试构建一个非常简单的基本应用程序,它使用MVVM模式将选项卡项添加到选项卡控件。 所以我创造了: 一个简单的视图,一个按钮 - “CustomerView.xaml”
一个空的ViewModel类 - 它是空的,因为视图没有保存或从Viewmodal中提取任何信息(只有一个按钮) - “CustomerViewModel.cs”
MainWindow类代码包含CustomerViewModel的可观察集合 并有一个“添加客户”按钮 - 将客户标签项添加到tabcontrol和tabcontrol本身。
我不使用命令,因为此时它不相关,我只是在我向集合中添加新的CustomerViewModel时出现的新tabitem。
结果是,虽然我可以看到CustomerViewModel被添加到Observable集合中,但我仍然没有看到tabitems被添加到tabcontrol中 - 该集合没有更新tabcontrol。
这是MainWindow XAML:
<Window x:Class="MyViewModalTabControl.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:MyViewModalTabControl.ViewModal"
xmlns:vw="clr-namespace:MyViewModalTabControl.Views"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<DataTemplate DataType="{x:Type vm:CustomerViewModel}">
<vw:CustTabView />
</DataTemplate>
<DataTemplate x:Key="ClosableTabItemTemplate">
<DockPanel Width="120">
<Button
Content="X"
Cursor="Hand"
DockPanel.Dock="Right"
Focusable="False"
FontFamily="Courier"
FontSize="9"
FontWeight="Bold"
Margin="0,1,0,0"
Padding="0"
VerticalContentAlignment="Bottom"
Width="16" Height="16"
/>
<ContentPresenter
Content="Sample"
VerticalAlignment="Center"
/>
</DockPanel>
</DataTemplate>
</Window.Resources>
<Grid Margin="4" ShowGridLines="True">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Button Name="CustTabButton" Content="New Customer" Height="30" Margin="12,136,9,136" Click="CustTabButton_Click"></Button>
<TabControl Grid.Column="1" Grid.Row="0" Background="Red"
ItemsSource="{Binding CustomerTabs}"
ItemTemplate="{StaticResource ClosableTabItemTemplate}"
>
</TabControl>
</Grid>
这是MainWindow背后的代码:
public partial class MainWindow : Window
{
private ObservableCollection<CustomerViewModel> _customertabs;
public ObservableCollection<CustomerViewModel> CustomerTabs
{
get
{
if (_customertabs == null)
{
_customertabs = new ObservableCollection<CustomerViewModel>();
// _workspaces.CollectionChanged += this.OnWorkspacesChanged;
}
return _customertabs;
}
}
public MainWindow()
{
InitializeComponent();
}
private void CustTabButton_Click(object sender, RoutedEventArgs e)
{
CustomerViewModel CustomerWorkSpace = new CustomerViewModel();
this.CustomerTabs.Add(CustomerWorkSpace);
}
}
这是Viewmodel类:
public class CustomerViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
}
这是视图:
UserControl x:Class="MyViewModalTabControl.Views.CustTabView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<Button Name="CustTabButton" Content="New Customer" Height="30" Margin="12,136,9,136"></Button>
</Grid>
我缺少什么?
答案 0 :(得分:2)
你在哪里设置主窗口的datacontext?您的绑定只能使用正确的Datacontext。
并且创建一个mainviewmodel也不是更好,它会处理你现在放在mainwindow.cs中的东西吗?
编辑:请看看乔什史密斯的this msdn帖子。在那里你也可以找到一个可关闭的标签。
答案 1 :(得分:0)
尝试以下任何一种
答案 2 :(得分:0)
这是修复:
public MainWindow()
{
InitializeComponent();
this.DataContext=this;
}