Удаление кода из кода позади в WPF - PullRequest
1 голос
/ 26 января 2011

Я пытаюсь переместить часть кода моего проекта в отдельный класс.Часть, которая меня интересует, - это метод GetData.Я хотел бы переместить его из моего кода в отдельный класс под названием DataAccess.Буду признателен за вашу помощь.Спасибо!

MainWindow.xaml.cs

namespace Contact_Interests
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    private ObservableCollection<AggregatedLabel> myAggLabels;

    public ObservableCollection<AggregatedLabel> AggLabels
    {
        get { return myAggLabels; }
    }

    private ObservableCollection<ContactList> myContactLists;

    public IEnumerable<ContactList> ContactLists
    {
        get { return myContactLists; }
    }

    public MainWindow()
    {
        GetData();
        this.InitializeComponent();

        // Insert code required on object creation below this point.
    }

    public void GetData()
    {
        myAggLabels = new ObservableCollection<AggregatedLabel>();
        myContactLists = new ObservableCollection<ContactList>();

        DB2Connection conn = null;
        try
        {
            conn = new DB2Connection("XXXX;");
        }
        catch (Exception ex)
        {
            System.Windows.MessageBox.Show(ex.Message + " " + ex.InnerException);
        }

        //get all contactLists and their labels
        DB2Command command = new DB2Command("SQL SELECT statement");
        command.Connection = conn;

        conn.Open();

        //get all labels from database
        using (DB2DataReader dr = command.ExecuteReader())
        {
            while (dr.Read())
            {
                AggregatedLabel aggLabel = new AggregatedLabel();

                aggLabel.ID = Convert.ToInt32(dr["LABEL_ID"]);
                aggLabel.Name = dr["LABEL_NAME"].ToString();

                myAggLabels.Add(aggLabel);

            }
        }
        //Add unique contactLists to dictionary
        Dictionary<int, ContactList> myContactDictionary = new Dictionary<int, ContactList>();

        using (DB2DataReader dr = command.ExecuteReader())
        {
            while (dr.Read())
            {
               int id = Convert.ToInt32(dr["CONTACT_LIST_ID"]);

                if (!myContactDictionary.ContainsKey(id))
                {

                    ContactList contactList = new ContactList();

                    contactList.ContactListID = id;
                    contactList.ContactListName = dr["CONTACT_LIST_NAME"].ToString();
                    contactList.AggLabels = new ObservableCollection<AggregatedLabel>()
                {
                    new AggregatedLabel()
                    {
                        ID = Convert.ToInt32(dr["LABEL_ID"]),
                        Name = dr["LABEL_NAME"].ToString()
                    }

                };
                    myContactDictionary.Add(id, contactList);
                }
                else
                {
                    //populate existing contact lists with remaining labels
                    ContactList contactList = myContactDictionary[id];

                    contactList.AggLabels.Add
                    (
                        new AggregatedLabel() 
                        {
                            ID = Convert.ToInt32(dr["LABEL_ID"]),
                            Name = dr["LABEL_NAME"].ToString()
                        }
                    );
                }
            }
        }

        //add to observable collection      
        foreach (KeyValuePair<int, ContactList> contactKeyValue in myContactDictionary)
        {
            ContactList contactList = contactKeyValue.Value;

            myContactLists.Add(contactList);
        }

        conn.Close();        
    }
}

Ответы [ 2 ]

2 голосов
/ 26 января 2011

Вы должны создать для этого класс и просто переместить в него весь свой код.

Затем создайте экземпляр класса и установите его как DataContext для этого окна.

Если вы интересуетесь механикой и мотивацией (кроме простого извлечения кода), вы можете обратиться к моей серии по MVVM или к одному из множества замечательных MVVM-представлений .


Например, ваш код выше может быть:

namespace Contact_Interests
{
    public partial class MainWindowViewModel // : INotifyPropertyChanged
    {
        private ObservableCollection<AggregatedLabel> myAggLabels;

        public ObservableCollection<AggregatedLabel> AggLabels
        {
            get { return myAggLabels; }
        }

        private ObservableCollection<ContactList> myContactLists;

        public IEnumerable<ContactList> ContactLists
        {
            get { return myContactLists; }
        }

        public MainWindowViewModel()
        {
            GetData();

            // Insert code required on object creation below this point.
        }

        public void GetData()
        {
            myAggLabels = new ObservableCollection<AggregatedLabel>();
            myContactLists = new ObservableCollection<ContactList>();

            DB2Connection conn = null;
            try
            {
                conn = new DB2Connection("XXXX;");
            }
            catch (Exception ex)
            {
                System.Windows.MessageBox.Show(ex.Message + " " + ex.InnerException);
            }

            //get all contactLists and their labels
            DB2Command command = new DB2Command("SQL SELECT statement");
            command.Connection = conn;

            conn.Open();

            //get all labels from database
            using (DB2DataReader dr = command.ExecuteReader())
            {
                while (dr.Read())
                {
                    AggregatedLabel aggLabel = new AggregatedLabel();

                    aggLabel.ID = Convert.ToInt32(dr["LABEL_ID"]);
                    aggLabel.Name = dr["LABEL_NAME"].ToString();

                    myAggLabels.Add(aggLabel);

                }
            }
            //Add unique contactLists to dictionary
            Dictionary<int, ContactList> myContactDictionary = new Dictionary<int, ContactList>();

            using (DB2DataReader dr = command.ExecuteReader())
            {
                while (dr.Read())
                {
                   int id = Convert.ToInt32(dr["CONTACT_LIST_ID"]);

                    if (!myContactDictionary.ContainsKey(id))
                    {

                        ContactList contactList = new ContactList();

                        contactList.ContactListID = id;
                        contactList.ContactListName = dr["CONTACT_LIST_NAME"].ToString();
                        contactList.AggLabels = new ObservableCollection<AggregatedLabel>()
                    {
                        new AggregatedLabel()
                        {
                            ID = Convert.ToInt32(dr["LABEL_ID"]),
                            Name = dr["LABEL_NAME"].ToString()
                        }

                    };
                        myContactDictionary.Add(id, contactList);
                    }
                    else
                    {
                        //populate existing contact lists with remaining labels
                        ContactList contactList = myContactDictionary[id];

                        contactList.AggLabels.Add
                        (
                            new AggregatedLabel() 
                            {
                                ID = Convert.ToInt32(dr["LABEL_ID"]),
                                Name = dr["LABEL_NAME"].ToString()
                            }
                        );
                    }
                }
            }

            //add to observable collection      
            foreach (KeyValuePair<int, ContactList> contactKeyValue in myContactDictionary)
            {
                ContactList contactList = contactKeyValue.Value;

                myContactLists.Add(contactList);
            }

            conn.Close();        
        }
    }
}

Тогда ваше главное окно будет:

namespace Contact_Interests
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
         public MainWindow()
         {
              InitializeComponent();
              this.DataContext = new MainWindowViewModel();
         }
     }
 }
1 голос
/ 26 января 2011

Как и предполагал Рид, вы обязательно должны изучить шаблон MVVM, если планируете работать с WPF.Шаблон является неотъемлемой частью работы WPF.

Вот введение в MVVM, которое действительно помогло мне понять различные аспекты шаблона.

http://blog.lab49.com/archives/2650
http://www.lab49.com/files/videos/Jason%20Dolinger%20MVVM.wmv

Видео начинается с чего-то похожего на то, что у вас есть, в том, что у вас есть код обработки внутри кода, затем Джейсон переходит к переносу кода в отдельные классы, и конечный продукт представляет собой четкое разделение представления и обработки данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...