передача значений переменных из проекта WPF

Автор Тема: передача значений переменных из проекта WPF  (Прочитано 27162 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
2. this.DataContext = data; - на мой взгляд вы полезли в дебри, которые вам (по опыту) вообще не пригодятся. DataContext для всего окна нужно использовать, когда у вас все окно будет "привязано" к определенному классу. И это касается не только данных, но и событий и прочего. Вам это не нужно
Я, мягко говоря, не согласен с такой рекомендацией. Использование WPF без привязки данных не дает практически никаких преимуществ перед Windows Forms. Если "вам это не нужно", то пишите на Windows Forms. А если все-таки "вам это нужно", то читаем и изучаем концепцию MVVM

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Дмитрий Загорулькин, ты как-будто не прочитал, что я имел ввиду. DataContext для всего окна используется в паттерне MVVM - грубо говоря когда для всего окна разрабатывается специальный класс (View Model). В данном случае это все не нужно и достаточно привязки данных определенного класса к определенному элементу в окне

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Да, именно так и надо работать с WPF. И я не вижу причин, по которым именно этот случай является исключением. Товарищ nolte идет верным путем, но пока очень многого не понимает. Так не надо сбивать человека с него. Лучше сразу показывать как правильно делать а не учить неправильным вещам.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Дмитрий Загорулькин, вот мне нужно показать окно на котором будет всего один ComboBox со списком слоев. Чтобы его заполнить мне достаточно 4 строчки в xaml-разметке и еще пару строчек в коде. Ты предлагаешь для этого изучить и использовать паттерн MVVM, который требует не мало усилий и не мало кода. Зачем?
В любом случае - товарищу nolte информация для размышления предоставлена)

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
который требует не мало усилий и не мало кода.
Вот в том-то и дело, что не требует он много кода и много усилий. В случае, когда всего один комбобокс на форме, никакого кода для ViewModel писать не надо. VM в этом случае - просто коллекция нужных объектов. Достаточно будет использовать одну из встроенных коллекций - массив, список и т.п.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
VM в этом случае - просто коллекция нужных объектов. Достаточно будет использовать одну из встроенных коллекций - массив, список и т.п
Вот об этом и был мой ответ) И скорее всего товарищу nolte этого будет вполне достаточно
Лично мне вот MVVM пока никак не пригодился - я даже и не стал изучать/осваивать его

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
доброго времени суток вот и пример
Если я правильно понял задумку, то я бы сделал как-то так:
Извините, вам запрещён просмотр содержимого спойлеров.

Извините, вам запрещён просмотр содержимого спойлеров.

Извините, вам запрещён просмотр содержимого спойлеров.

Извините, вам запрещён просмотр содержимого спойлеров.

Оффлайн nolteАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 0
  • Skype: leoleo3172
Вот спасибо, по-моему, мнение чайника  :), оба способа хороши попробую разобраться и с тем и с другим.
Лень - двигатель прогресса.

Оффлайн nolteАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 0
  • Skype: leoleo3172
все классно, получилось работает как надо. с удовольствием налил бы подсказавшим ;D. будете в наших краях заходите :).
Лень - двигатель прогресса.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
все классно, получилось работает как надо
Так по какому пути вы пошли? MVVM или обычный binding в ItemSource?

Оффлайн nolteАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 0
  • Skype: leoleo3172
еще не пошел, но хорошо, что есть выбор. я так думаю, для не больших окон (2-3 переменные) подходит Ваш способ, ну а больше все же метод с дата файлом выглядит поприличней малеха. хотя все надо пощупать, попробовать на практике, протестить с опытом все взгляды меняются, как известно.
Лень - двигатель прогресса.

Оффлайн alihovsky

  • ADN OPEN
  • Сообщений: 27
  • Карма: 2
Приветствую.
Кто нибудь может оценить код?
Wpf окно с кнопки запрашивает центр круга, комбобокс собирает слои и назначает выбранный слой кругу, в текстбоксе радиус круга
Вопрос к спецам, нет здесь грубых ошибок? Код рабочий
Код - C# [Выбрать]
  1.  
  2. using System;
  3. using Autodesk.AutoCAD.Runtime;
  4. using AcApp = Autodesk.AutoCAD.ApplicationServices.Application;
  5.  
  6.  
  7. namespace WPFexample
  8. {
  9.     public class Class1
  10.     {
  11.  
  12.  
  13.         private static ModlessWindow _modlessWindow;
  14.         [CommandMethod("TestModless")]
  15.         public static void SecondExample()
  16.         {
  17.  
  18.  
  19.             if (_modlessWindow == null)
  20.             {
  21.                 _modlessWindow = new ModlessWindow();
  22.                 _modlessWindow.Closed += win_Closed;
  23.             }
  24.  
  25.  
  26.             if (_modlessWindow.IsLoaded)
  27.                 _modlessWindow.Activate();
  28.             else
  29.                 AcApp.ShowModelessWindow(AcApp.MainWindow.Handle, _modlessWindow, false);
  30.         }
  31.        
  32.         static void win_Closed(object sender, EventArgs e)
  33.         {
  34.             _modlessWindow = null;
  35.         }
  36.     }
  37. }
  38. using System.Windows;
  39. using System.Linq;
  40. using Autodesk.AutoCAD.ApplicationServices;
  41. using Autodesk.AutoCAD.DatabaseServices;
  42. using Autodesk.AutoCAD.EditorInput;
  43. using Autodesk.AutoCAD.Geometry;
  44. using Autodesk.AutoCAD.Windows.Data;
  45. using AcAp = Autodesk.AutoCAD.ApplicationServices.Application;
  46. using System.Windows.Input;
  47. using System;
  48.  
  49. namespace WPFexample
  50. {
  51.     /// <summary>
  52.     /// Логика взаимодействия для ModlessWindow.xaml
  53.     /// </summary>
  54.     public partial class ModlessWindow
  55.     {  
  56.         DataItemCollection my_layers;
  57.         public ModlessWindow()
  58.         {
  59.             InitializeComponent();
  60.             my_layers = AcAp.UIBindings.Collections.Layers;
  61.             //привязка данных слоя к ComboBox        
  62.             BindData();
  63.             // обновление ComboBox при изменении набора данных слоев
  64.             my_layers.CollectionChanged += (s, e) => BindData();
  65.         }
  66.  
  67.         private void BtAccept_OnClick(object sender, RoutedEventArgs e)
  68.         {            
  69.             {
  70.                 double my_radius;
  71.                 double.TryParse(TextBox.Text, out my_radius);
  72.                 var doc = AcAp.DocumentManager.MdiActiveDocument;
  73.                 if (doc != null)
  74.                 {
  75.                     // установить фокус на редактор AutoCAD                  
  76.                     AcAp.MainWindow.Focus();      
  77.                     using (doc.LockDocument())
  78.                     {
  79.                         DrawCircle(doc, my_radius, (string)cbxLayer.SelectedItem);
  80.                     }
  81.                 }
  82.             }
  83.         }
  84.  
  85.         private void DrawCircle(Document doc, double radius, string layer)
  86.         {
  87.             var db = doc.Database;
  88.             var ed = doc.Editor;
  89.             var ppr = ed.GetPoint("\nУкажите центр: ");
  90.             if (ppr.Status == PromptStatus.OK)
  91.             {
  92.                 using (var tr = db.TransactionManager.StartTransaction())
  93.                 {
  94.                     var curSpace =
  95.                         (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  96.                     using (var circle = new Circle(ppr.Value, Vector3d.ZAxis, radius))
  97.                     {
  98.                         circle.TransformBy(ed.CurrentUserCoordinateSystem);
  99.                         circle.Layer = layer;
  100.                         curSpace.AppendEntity(circle);
  101.                         tr.AddNewlyCreatedDBObject(circle, true);
  102.                     }
  103.                     tr.Commit();
  104.                 }
  105.             }
  106.         }
  107.  
  108.         private void BindData()
  109.         {
  110.             // привязка к источнику данных
  111.             // DataItemCollection преобразуется в массив имен слоев
  112.             cbxLayer.ItemsSource = my_layers.Select(x => ((INamedValue)x).Name).ToArray();
  113.             // выбор текущего слоя
  114.             cbxLayer.SelectedItem = ((INamedValue)my_layers.CurrentItem)?.Name;
  115.         }
  116.  
  117.         private void BtCancel_OnClick(object sender, RoutedEventArgs e)
  118.         {
  119.             Close();
  120.         }
  121.  
  122.         private void TextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
  123.         {
  124.         }
  125.  
  126. private void textBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
  127.         {
  128.             if (!(Char.IsDigit(e.Text, 0) || (e.Text == ".")
  129.                && (!TextBox.Text.Contains(".")
  130.                && TextBox.Text.Length != 0)))
  131.             {
  132.                 e.Handled = true;
  133.             }
  134.         }
  135.     }