Advertisement
gr4viton

dip item inconsistent

Mar 16th, 2015
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.28 KB | None | 0 0
  1. Tak jsem to nějak vytvořil.. ale mám problém..
  2. používám
  3.  
  4. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5.     internal class C_Logger // singletonově napsaná
  6.     {
  7.         //private DataTable dataTable;
  8.         private ObservableCollection<LogMessageRow> itemList;
  9.  
  10.         public void LOG(string _src, string _msg)
  11.         {
  12.             itemList.Add(new LogMessageRow { src = _src, msg = _msg });
  13.         }
  14.  
  15.         // property
  16.         public ObservableCollection<LogMessageRow> Data
  17.         {
  18.             get { return itemList; }
  19.         }
  20.  
  21.     }
  22.  
  23.     public class LogMessageRow
  24.     {
  25.         public string src { get; set; }
  26.         public string msg { get; set; }
  27.     }
  28.  
  29. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  30. .. a potom v main.xaml
  31.  
  32.         <DataGrid
  33.               DataContext="{StaticResource ItemCollectionViewSource}"
  34.               ItemsSource="{Binding}"
  35.               AutoGenerateColumns = "False"
  36.               CanUserAddRows="False"
  37.             >
  38.             <DataGrid.Columns>
  39.                 <DataGridTextColumn Header="Source" IsReadOnly="True"  Binding="{Binding Path=src}" Width="50"></DataGridTextColumn>
  40.                 <DataGridTextColumn Header="Message" IsReadOnly="True"  Binding="{Binding Path=msg}" MinWidth="50" ></DataGridTextColumn>
  41.             </DataGrid.Columns>
  42.         </DataGrid>
  43.  
  44. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  45. a v main.cs binding
  46.  
  47.     public MainWindow()
  48.     {
  49.         InitializeComponent();
  50.  
  51.             // link business data to CollectionViewSource
  52.             CollectionViewSource itemCollectionViewSource;
  53.             itemCollectionViewSource = (CollectionViewSource)(FindResource("ItemCollectionViewSource")); // jenom abych nemusel davat nazev (odněkud zkopčeno)
  54.             itemCollectionViewSource.Source = C_Logger.Instance.Data;
  55.  
  56.     }
  57.  
  58.  
  59.     private void Button_Click(object sender, RoutedEventArgs e)
  60.     {
  61.         C_Logger.Instance.LOG_gui("GUI","SOMETHING HAPPENED"); // funguje normálně přidá
  62.     }
  63.  
  64.  
  65. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  66. SPI (napsany jenom tak..)
  67.  
  68.     internal class C_SPI
  69.     {
  70.  
  71.         private static object locker = new object();
  72.         private static SerialPort spi;
  73.  
  74.         public static bool WriteData(byte[] data)
  75.         {
  76.             lock (locker)
  77.             {
  78.                 int q = 10; // try q-times
  79.                 while (q>0)
  80.                 {
  81.                     if (spi.IsOpen)
  82.                     {
  83.                         WriteSerialPort(data);
  84.                         return true;
  85.                         //responseBuffer = ReadSerialPort(8);
  86.                     }
  87.                     else
  88.                     {
  89.                         OPEN_connection();
  90.                     }
  91.                     q--;
  92.                 }
  93.             }
  94.             return false; // should never run as far as to this line
  95.         }
  96.  
  97.  
  98.         private static void WriteSerialPort(byte[] data)
  99.         {
  100.             //spi.Write(data, 0, data.Length);
  101.             C_Logger.Instance.LOG_spi("SPI HAPPENED"); // tohle je to co se mu nelíbí
  102.         }
  103.     }
  104.  
  105. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  106. motor
  107.     internal class C_Motor
  108.     {
  109.  
  110.         public void SEND_cmd(byte[] cmd)
  111.         {
  112.             BackgroundWorker worker = new BackgroundWorker();
  113.             worker.RunWorkerCompleted += worker_RunWorkerCompleted;
  114.             worker.DoWork += worker_DoWork;
  115.  
  116.             //SEND_cmd_eventArgs args = new SEND_cmd_eventArgs(id, cmd);
  117.             DoWorkEventArgs args = new SEND_cmd_eventArgs(id, cmd);
  118.             worker.RunWorkerAsync(args);
  119.         }
  120.  
  121.         private void worker_DoWork(object sender, DoWorkEventArgs e)
  122.         {
  123.             byte[] b = new byte[0];
  124.             e.Result = C_SPI.WriteData(b);
  125.         }
  126.  
  127.         private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  128.         {
  129.             // catch if response was A-OK
  130.             if (e.Error != null)
  131.             {
  132.                 C_Logger.Instance.LOG_motX_e(id,String.Format("{0}:\n{1}",e.Error.Data ,e.Error.Message));
  133.             }
  134.             else
  135.             {
  136.                 C_Logger.Instance.LOG_mot("DATA SENT");
  137.                 //var results = e.Result as List<object>;
  138.             }
  139.         }
  140.     }
  141.  
  142.  
  143. // no ale nejde mi dyž zavolám tu fci LOG když jsem v SPI writing funkci (respektive že ju volám v tom Background workeru)
  144. no a ona se nepřidá do datagridu..
  145. a když pak zkusim přidat item zase tlačítkem, tak mi zahlásí že ten binding není stejnej na obou stranách - jakokdyby se nevyvolala změna dyž jsem v jiném threadu
  146.  
  147. An item control is inconsistent with its source
  148.  
  149. řešení:
  150. 1) to musím ošetřit volání pro změnu v tom ObservableCollectionu zavolat event sám?
  151. 2) nevolat v tom novém threadu vůbec LOG, ale pouze např vyčíst zpětnou hodnotu background workera a do logu zapsat potom co se z něj vrátím?
  152. 3) je to v tom že binduju ObservableCollection<LogMessageRow> itemList; na DataGrid ? a nemam tam ten DataTable jak jsi říkal původně?
  153.  
  154.  
  155. esi to z toho nejde pochopit, tak udělám nějaký minimum example a pošlu :)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement