Setting TabItem.Content to a UserControl in Avalonia

108 Views Asked by At

I am trying to set the content of a TabItem to be that of a UserControl on a button press, however it throws an exception - "Exception thrown: 'System.InvalidCastException' in System.Private.CoreLib.dll".

The odd thing is despite throwing the exception it still appears to add the tab.

My Code:

public void AddTabItem(ref TabItem tabItem, string title, UserControl view)
    {
        if (tabItem == null)
        {
            tabItem = new TabItem();
            tabItem.Header = title;            
            tabItem.Content = view;                        
            MainTabControl.Items.Add(tabItem);   - this line giving the error                     
        }                
        MainTabControl.SelectedItem = tabItem;        
    }

public void ClickHandler(object sender, RoutedEventArgs e)
    {
        var source = e.Source as Control;
        switch (source.Name)
        {            
            case "AddClientBtn":                
                ClientView clientView= new ClientView();
                ClientViewModel clientViewModel = new ClientViewModel();
                clientView.DataContext = clientViewModel;
                AddTabItem(ref addClientTabItem, "Add Client", clientView);
                break;            
            default:
                
                break;
        }
        e.Handled = true;
    }

<UserControl xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"             
             xmlns:vm="clr-namespace:MyProject.ViewModels"              
             mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
             x:Class="MyProject.Views.ClientView"
             x:DataType="vm:ClientViewModel">
  <Design.DataContext>
    <vm:ClientViewModel />
  </Design.DataContext>

  <StackPanel>
    <ListBox ItemsSource="{Binding Clients}">
      <ListBox.ItemTemplate>
        <DataTemplate>
          <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding FirstName}" Margin="0,0,10,0"/>
            <TextBlock Text="{Binding LastName}"/>
          </StackPanel>
        </DataTemplate>
      </ListBox.ItemTemplate>
    </ListBox>
    
    
    <DataGrid x:Name="testGrid" Margin="20" ItemsSource="{Binding Clients}"
          AutoGenerateColumns="True"
         GridLinesVisibility="All"
         BorderThickness="1" BorderBrush="Gray" Grid.Row="2" Grid.Column="0"
             HeadersVisibility="All">
      <DataGrid.Columns>
        <DataGridTextColumn Header="First Name" Width="*" Binding="{Binding FirstName}"/>
          <DataGridTextColumn Header="Last Name" Width="*" Binding="{Binding LastName}"/>                  
      </DataGrid.Columns>
    </DataGrid>
  </StackPanel>

</UserControl>

0

There are 0 best solutions below