从 TabControl 中删除选项卡:错误 4 无法找到绑定源

问题描述 投票:0回答:1
c# wpf data-binding tabcontrol
1个回答
0
投票

只要您使用代码隐藏,您就永远无法享受 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);
        }
    }

对我来说效果很好。

© www.soinside.com 2019 - 2024. All rights reserved.