none
Eigenschaften von Objekten die nicht DP fähig sind ins MVVM einbinden RRS feed

  • Frage

  • Hallo!

    Ich versuche ein Projekt, das nicht nach dem MVVM-Modell programmiert war auf MVVM umzustellen.

    Vieles geht standardmäßig, aber bei Eigenschaften, bei denen ich kein Binding auf das VM setzen kann, komme ich nicht weiter.

    Ich habe ein TabControl, dessen TabItem's ich durch ein ContentTemplate -> DataTemplate an mein DataModel binde.

    <TabControl x:Name="tcSQLTabellen" ItemsSource="{Binding ViewTabellen}">
        <TabControl.ItemContainerStyle>
            <Style TargetType="{x:Type TabItem}">
                <Setter Property="Header">
                    <Setter.Value>
                        <Binding Path="TabellenBezeichnung"/>
                    </Setter.Value>
                </Setter>
            </Style>
        </TabControl.ItemContainerStyle>
        <TabControl.ContentTemplate>
            <DataTemplate>
                <TextBox x:Name="tc_tboSQL" Text="{Binding SQL, Mode=TwoWay}" HorizontalAlignment="Left" VerticalAlignment="Top" 
                                            CaretIndex="{Binding SQL_CaretIndex, Mode=TwoWay}" 
                                            SelectionStart="{Binding SQL_SelectionStart}"
                                                />
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>
    

    Mein Problem ist nun, dass ich die CaretIndex-Eigenschaft der TextBox nicht binden kann, da sie keine DP ist.

    Wie ändere ich von der VM aus denn dann die CaretIndex-Eigenschaft der TextBox des DataTemplates???

    Fred.

    Der Vollständigkeit halber, mein VM:

    public class svTabelle : DependencyObject
    {
        public DataTable Tabelle { get; set; }                          // Daten-Tabelle
        public string SQL { get; set; }                                 // SQL-Statment
    
        public int SQL_CaretIndex { get; set; }                         // Kursorposition in der TextBox des SQL Statement's
        public int SQL_SelectionStart { get; set; }                     // Start-Position des selektierten Bereiches in der TextBox des SQL Statement's
    
        public string TabellenName { get; set; }                        // Name der DataTable (wird für Berichte benötigt!)
        public string TabellenBezeichnung { get; set; }                 // Tabellen-Bezeichnung (wird als Reiter-Name angezeigt)
        public int ID { get; set; }                                     // ID
    
        public svTabelle(int _ID, string _SQL = "", DataTable _Tabelle = null, string _TabellenName = "", string _TabBez="")
        {
            ID = _ID; SQL = _SQL;                                                           // ID und SQL-Statement übernehmen
            Tabelle = _Tabelle != null ? _Tabelle : new DataTable();                        // Leere Tabelle oder übergebene Tabelle übernehmen
            TabellenName = string.IsNullOrEmpty(_TabellenName) ? App.zStdTabellenName + "-" + ID.ToString("00") : _TabellenName ;
            TabellenBezeichnung = string.IsNullOrEmpty(_TabBez) ? TabellenName : _TabBez;   // Übergebene Tabellenbezeichnung übernehmen oder Tabellenbezeichnung aus Tabellenname erstellen
            Tabelle.TableName = TabellenName;                                               // Tabellen-Name für Tabelle übernehmen
        }
    
    }
    
    
    /// <summary>
    /// ViewModel des SQL-Viewer's
    /// </summary>
    public class vmSV : INotifyPropertyChanged
    {
        #region  OnPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged([CallerMemberName] string propName = "") =>
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
        #endregion
    
        #region SQL-Tabellen
        CollectionViewSource cvsTabellen = new CollectionViewSource();                          // Collection der SQL-Viewer-Tabellen
           
        public ICollectionView ViewTabellen { get { return cvsTabellen.View; } }                // View der SQL-Viewer Tabellen
    
        public svTabelle SelectedTabelle { get; set; }                                          // Aktuell selektierte Tabelle (mit allen Eigenschaften)
    
    
        public vmSV(List<svTabelle> _svTabellen = null)
        {
            if (_svTabellen == null) _svTabellen = new List<svTabelle>();                       // Wurde keine Liste von SQL-Viewer-Tabellen-Eintägen übergeben? -> Leere Liste erstellen
            if (_svTabellen.Count == 0) { _svTabellen.Add(new svTabelle(1, App.zStdOraSQL)); }  // Wenn noch keine SQL-Viewer-Tabellen-Eintrag vorhanden ist, immer einen Standard-Eintrag erzeugen (ID=1)
            cvsTabellen.Source = _svTabellen;                                                   // SQL-Viewer-Tabellen-Einträge initalisieren            
            SelectedTabelle = (svTabelle)cvsTabellen.View.CurrentItem;                          // Das akt. selektierte Tabelle Objekt initalisieren
            SelectedTabelle.SQL = App.zStdOraSQL;                                               // Start-Text für SQL-Statment-Eingabe setzen.
            SelectedTabelle.SQL_CaretIndex = int.MaxValue;                                      // Kursor an das Ende setzen
            cvsTabellen.View.CurrentChanged += Tabellen_View_CurrentChanged;                    // View-Änderungs-Event deklarieren
            OnPropertyChanged(nameof(ViewTabellen));                                            // Der Oberfläche mitteilen, dass sich der Inhalt der Sicht geändert hat
        }
    
        private void Tabellen_View_CurrentChanged(object sender, EventArgs e)
        {
            SelectedTabelle = (svTabelle)cvsTabellen.View.CurrentItem;                          // Das zentrale, akt. selektierte Tabelle Objekt, aktualisieren            
        }
        #endregion SQL-Tabellen
    }

    Donnerstag, 14. Februar 2019 13:23

Antworten

  • Hi,

    vielleicht hilft dir das oder das weiter.

    Selber habe ich so etwas noch nicht benötigt, deshalb kann ich kein Beispiel anfügen.

    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    • Als Antwort markiert perlfred Samstag, 16. Februar 2019 05:30
    Donnerstag, 14. Februar 2019 13:39

Alle Antworten

  • Hi,

    vielleicht hilft dir das oder das weiter.

    Selber habe ich so etwas noch nicht benötigt, deshalb kann ich kein Beispiel anfügen.

    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    • Als Antwort markiert perlfred Samstag, 16. Februar 2019 05:30
    Donnerstag, 14. Februar 2019 13:39
  • Hallo Stefan!

    Das ich beim ersten Projekt gleich auf eine Ausnahme stoße, hätte ich ja nicht gedacht.    °|° 

    Ich habe das so verstanden:

    Man muss eine angefügte DP erstellen um über diese auf die nicht DP-Eigenschaft des Framework-Objektes zuzugreifen und kann dann die angefügte DP im ViewModel binden.

    Ich sehe mir deinen zweiten Link mal genauer an und hoffe, dass ich diesen als Vorlage benutzen kann.

    Vielen Dank! für deine Hilfe!

    Fred.



    • Bearbeitet perlfred Samstag, 16. Februar 2019 05:51 Kongretisierung
    Donnerstag, 14. Februar 2019 16:13