只要您使用代码隐藏,您就永远无法享受 WPF 的乐趣。你总是会陷入“解决方法-陷阱”。如果您遵循 MVVM 模式,事情会变得容易得多。
我刚刚在我的应用程序中创建了一个 TabControl ,它绑定到一个 Observable Collection
在此可观察集合中是 TabItemModel:
public class TabItemModel : ViewModelBase
{
private string _header;
private ObservableObject _content;
public string Header
{
get { return _header; }
set
{
_header = value;
RaisePropertyChanged(nameof(Header));
}
}
public ObservableObject Content
{
get { return _content; }
set
{
_content = value;
RaisePropertyChanged(nameof(Content));
}
}
private readonly IMessenger _messenger;
public RelayCommand CloseTabCommand { get; set; }
public TabItemModel(IMessenger messenger)
{
_messenger = messenger;
CloseTabCommand = new RelayCommand(CloseThisTab);
}
private void CloseThisTab()
{
_messenger.Send(this);
}
}
这里是 XAML - 此 TabControl 的一部分:
<TabControl Grid.Column="1" Grid.ColumnSpan="2"
Grid.Row="1" Grid.RowSpan="2"
ItemsSource="{Binding TabItems.Models}"
SelectedItem="{Binding ActiveTab, Mode=TwoWay}">
<TabControl.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness="2" CornerRadius="5" Margin="10,0,0,0">
<Grid Width="auto">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="9*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Header}"
FontSize="12" FontWeight="DemiBold"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Margin="12,0"
Width="auto"/>
<Button Grid.Column="1"
Foreground="White" Command="{Binding CloseTabCommand}"
HorizontalAlignment="Right"
Padding="5"
VerticalContentAlignment="Center"
Margin="5">
<Button.Content>
<Image Source="/icon-delete.png" Height="12" Width="12"/>
</Button.Content>
</Button>
</Grid>
</Border>
</DataTemplate>
</TabControl.ItemTemplate>
MainViewModel 中的声明:
[ObservableProperty]
TabItemViewModel tabItems;
[ObservableProperty]
TabItemModel activeTab;
XAML 中的按钮会触发 TabItemModel 中的 Relay-Command,该命令会向 View-Model 发送消息以关闭选项卡。我只是从集合中删除了这个特定的模型:
public void Handle(TabItemModel message)
{
if (TabItems.Models.Count > 0)
{
TabItems.Models.Remove(message);
}
}
对我来说效果很好。