none
TabControl bzw. ContentTemplate zeigt Daten erst nach einem Tab wechsle RRS feed

  • Frage

  • Hallo zusammen,
    ich komme einfach nicht weiter bei meinem Problem, welches sich wie folgt darstellt:

    In einem View wird nach Personen gesucht die eventuell etwas Ausgeliehen haben. Werden Leihvertäge gefunden wird in einem Tabcontrol zur Laufzeit für jeden Vertrag ein TabItem generiert.
    Im dem TabContent wird ein weiterer View geladen, der die einzelnen Leihpositionen (ein Buch) untereinander anzeigt und auf der rechten Seite Details zu den Einzelnen Büchern darstellt.
    Aber jetzt zum meinem Problem:
    Die Suche Funktioniert, ich bekomme auch im TabItem-Header die Vertragsnummer angezeigt, aber der TabContent wird nicht geladen. Es werden zwar die Steuerelemente Angezeigt aber nicht deren
    Inhalte (die TextBox ist da aber es fehlt der Inhalt z.B. Name des Autors). Gibt es mehr als einen Tab und ich wechsle zwischen den beiden Tabs werden die Informationen richtigen in den Steuerelementen angezeigt.
    Ich habe aber keine Ahnung wie ich das lösen kann wenn nur ein Tab da bzw. will ich nicht immer erst den Tab wechseln müssen :-). Aber auch wenn ich den Fokus auf eines  der TabItems setze wird erst nach dem Umschalten zwischen zwei Tabs der Inhalt angezeigt.  

    Ich verwende das ModernUI und MVVMLight

    View der das Tabcontrol enthält:

    <UserControl x:Class="TEST_MUI.View.LoanContracts.LoanContracts_View"
                 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" 
                 xmlns:mui="http://firstfloorsoftware.com/ModernUI"
                 xmlns:singleContact="clr-namespace:TEST_MUI.View.LoanContracts"
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300"
                 DataContext="{Binding LoanContracts_VM ,Source={StaticResource Locator}}">
        <Grid Style="{StaticResource ContentRoot}">
            <TabControl ItemsSource="{Binding TabItems}" SelectedIndex="{Binding SelectedTabItemIndex, Mode=TwoWay}" 
                        BorderThickness="1,1,1,0" BorderBrush="Transparent" Background="Transparent" 
                        SelectedItem="{Binding SelectedItem, Mode=TwoWay}">
                <TabControl.ItemTemplate>
                    <!-- this is the header template-->
                    <DataTemplate>
                        <TextBlock
                        Text="{Binding Header}" />
                    </DataTemplate>
                </TabControl.ItemTemplate>
                <TabControl.ContentTemplate>
                    <!-- this is the body of the TabItem template -->
                    <DataTemplate>
                        <singleContact:SingleLoanContract_View Margin="50 0 0 0" FlowDirection="LeftToRight"/>
                    </DataTemplate>
                </TabControl.ContentTemplate>
            </TabControl>
        </Grid>
    </UserControl>

    Das ViewModel dazu

    namespace Test_MUI.ViewModel.LoanContracts
    {
        public class LoanContracts_ViewModel : ViewModelBase
        {
    
            private ObservableCollection<TabItem> _tabitems = new ObservableCollection<TabItem>();
            public ObservableCollection<TabItem> TabItems
            {
                get
                {
                    return _tabitems;
                }
    
                set
                {
                    _tabitems = value;
                    RaisePropertyChanged("TabItems");
    
                }
            }
    
            private int _selectedtabitemindex;
            public int SelectedTabItemIndex
            {
                get
                {
                    return _selectedtabitemindex;
                }
    
                set
                {
                    if (_selectedtabitemindex != value)
                    {
                        _selectedtabitemindex = value;
                        RaisePropertyChanged("SelectedTabItemIndex");
                        Messenger.Default.Send<LoanContract_Message>(new LoanContract_Message() { Contractnumber =  SelectedTabItemIndex});
                    }
                }
            }
    
    
            public LoanContracts_ViewModel()
            {
                Messenger.Default.Register<LoanContractsFilter_Message>(this, (action) => DisplayContractDetails(action));
            }
    
    		
    		//ein paar Tabs erzeugen
            private void DisplayContractDetails(LoanContractsFilter_Message message)
            {
                TabItems.Clear();
    
                for(int i =0; i <  10; i++)
                {
                    _tabitems.Add(new TabItem { Header = i.ToString() });
                }
            }
        }
    }

    Das View für einen einzelnen Vertrag, momentan nur eine Textbox die die Nummer des Tabs anzeigt.

    <UserControl x:Class="TEST_MUI.View.LoanContracts.SingleLoanContract_View"
                 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" 
                 xmlns:mui="http://firstfloorsoftware.com/ModernUI"
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300"
                  DataContext="{Binding SingleLoanContract_VM, Source={StaticResource Locator}}">
        <Grid Style="{StaticResource ContentRoot}">
            <ScrollViewer>
                <TextBox Text="{Binding Path=MyText}" Width="100" Height="30"/>
            </ScrollViewer>
        </Grid>
    </UserControl>

    Das ViewModel dazu:
    using GalaSoft.MvvmLight;
    using GalaSoft.MvvmLight.Messaging;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using TEST_MUI.Messaging;
    
    namespace TEST_MUI.ViewModel.LoanContracts
    {
        public class SingleLoanContract_ViewModle : ViewModelBase
        {
    
            private string _myText = "";
            public string MyText
            {
                get
                {
                    return _myText;
                }
    
                set
                {
                    _myText = value;
                    RaisePropertyChanged("MyText");
                }
            }
    
            public SingleLoanContract_ViewModle()
            {
                Messenger.Default.Register<LoanContract_Message>(this, (action) => ContractDetails(action));
            }
    
    
            private void ContractDetails(LoanContract_Message message)
            {
                MyText = message.Contractnumber.ToString();
            }
    
        }
    }

    Donnerstag, 13. Juli 2017 12:22

Alle Antworten

  • Hallo ELLoro,

    Würdest Du die IsSynchronizedWithCurrentItem-Eigenschaft des Registerkarten-Steuerelements (TabControl) auf true festlegen? Sieh Dir das Beispiel in folgendem Thread an:
    WPF Tabcontrol (TabItem Content is not appearing)

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 14. Juli 2017 12:14
    Moderator
  • Hallo Dimitar,

    vielen Dank für den Link, aber ich werde daraus nicht ganz schlau wie ich das bei mir umsetzen muss. 

    Montag, 17. Juli 2017 13:12