Я сделал это аналогично тому, что сплинтор выше.
Ваше представление:
<ComboBox
ItemsSource="{Binding CompetitorBrands}"
DisplayMemberPath="Value"
SelectedValuePath="Key"
SelectedValue="{Binding Path=CompMfgBrandID,
Mode=TwoWay,
UpdateSourceTrigger=Explicit}" //to indicate that you will call UpdateSource() manually to get the property "CompMfgBrandID" udpated
SelectionChanged="ComboBox_SelectionChanged" //To fire the event from the code behind the view
Text="{Binding CompMFGText}"/>
Ниже приведен код для обработчика событий «ComboBox_SelectionChanged» из файла кода за представлением. Например, если вы просматриваете myview.xaml, имя файла кода для этого обработчика событий должно быть myview.xaml.cs
private int previousSelection = 0; //Give it a default selection value
private bool promptUser true; //to be replaced with your own property which will indicates whether you want to show the messagebox or not.
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ComboBox comboBox = (ComboBox) sender;
BindingExpression be = comboBox.GetBindingExpression(ComboBox.SelectedValueProperty);
if (comboBox.SelectedValue != null && comboBox.SelectedIndex != previousSelection)
{
if (promptUser) //if you want to show the messagebox..
{
string msg = "Click Yes to leave previous selection, click No to stay with your selection.";
if (MessageBox.Show(msg, "Confirm", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) //User want to go with the newest selection
{
be.UpdateSource(); //Update the property,so your ViewModel will continue to do something
previousSelection = (int)comboBox.SelectedIndex;
}
else //User have clicked No to cancel the selection
{
comboBox.SelectedIndex = previousSelection; //roll back the combobox's selection to previous one
}
}
else //if don't want to show the messagebox, then you just have to update the property as normal.
{
be.UpdateSource();
previousSelection = (int)comboBox.SelectedIndex;
}
}
}
В число вещей, которые я хочу сделать, входит представление произвольных фрагментов данных в различных формах (двоичная, десятичная, шестнадцатеричная), преобразование данных из одного порядка байтов в другой и т. Д. То есть то, что вы обычно делаете используйте C или ассемблер для, но я ищу язык, который позволяет очень быстро писать крошечные фрагменты кода для узкоспециализированных одноразовых целей.
Что ж, хотя это может показаться нелогичным, я обнаружил erlang очень хорошо подходит для этого, а именно благодаря мощной поддержке сопоставления с образцом , даже для байтов и битов (так называемый « битовый синтаксис Эрланга »). Это позволяет очень легко создавать даже очень сложные программы, которые занимаются проверкой и обработкой данных на байтовом и даже на битовом уровне:
С 2001 г. Функциональный язык Erlang имеет байтовый тип данных (называемый двоичным) и конструкции для сопоставления с образцом в двоичном файле.
И процитируем informIT.com :
(Erlang) Сопоставление с образцом действительно начинает весело в сочетании с двоичным тип. Рассмотрим приложение, которое получает пакеты из сети и затем обрабатывает их. Четыре байта в пакет может быть сетевым байтовым порядком идентификатор типа пакета. В Erlang вы потребуется всего лишь один processPacket функция, которая могла бы преобразовать это в структура данных для внутреннего обработка. Это бы выглядело что-то двоичное сопоставление с образцом
Устройство чтения / записи MIDI-файлов на Erlang Битовый синтаксис Erlang Понимание порядка байтов Игра с Erlang Эрланг: объявления сопоставления с образцом и утверждения регистра / другое Потоковая библиотека Двоичные файлы Erlang Двоичные файлы битового уровня и обобщенные представления в Erlang Приложения, реализация и оценка производительности программирования битовых потоков в Erlang
Я использую 010 Editor для постоянного просмотра двоичных файлов, чтобы просмотреть двоичные файлы. Он особенно приспособлен для работы с двоичными файлами.
Он имеет простой в использовании c-подобный язык сценариев для анализа двоичных файлов и представления их в очень удобочитаемом виде (в виде дерева, поля, закодированные по цвету, и тому подобное). . Есть несколько примеров сценариев для анализа файлов zip и bmp.
Каждый раз, когда я создаю двоичный формат файла, я всегда делаю небольшой сценарий для редактора 010 для просмотра файлов. Если у вас есть файлы заголовков с некоторыми структурами, создание программы для чтения двоичных файлов займет считанные минуты.
Взгляните на битовую строку python , похоже, именно то, что вам нужно :)
В стандартной библиотеке Python есть кое-что из того, что вам нужно - в частности, модуль array позволяет легко читать части двоичных файлов, порядок байтов подкачки и т. Д .; модуль struct позволяет более детально интерпретировать двоичные строки. Однако ни один из них не является настолько богатым, насколько вам требуется: например, чтобы представить одни и те же данные в виде байтов или полуслов, вам необходимо скопировать их между двумя массивами (стороннее дополнение numpy намного удобнее мощный для интерпретации одной и той же области памяти несколькими различными способами), и, например, для отображения некоторых байтов в шестнадцатеричном формате, нет ничего особенного, кроме простого цикла или понимания списка, такого как [шестнадцатеричный (b) для b в байтах [начало: стоп]]
.
Подойдет любой язык программирования высокого уровня с функциями упаковки / распаковки. Все 3 Perl, Python и Ruby могут это сделать. Это вопрос личных предпочтений. Я написал немного двоичного синтаксического анализа для каждого из них и почувствовал, что Ruby был самым простым / самым элегантным для этой задачи.
Почему бы не использовать интерпретатор языка Си? Я всегда использовал их, чтобы экспериментировать с сниппетами, но вы можете использовать их для написания чего-то вроде того, что вы описываете, без особых проблем.
Мне всегда нравился EiC . Он был мертв, но недавно проект воскрес. EiC на удивление способный и достаточно быстрый. Также существует CINT . Оба могут быть скомпилированы для разных платформ, хотя я думаю, что CINT нужен Cygwin для Windows.
Если вы выполняете обработку на двоичном уровне, это очень низкий уровень, который, вероятно, должен быть очень эффективным и иметь минимальные требования к зависимостям / установке.
Я бы пошел с C - хорошо обрабатывает байты - и вы, вероятно, можете найти в Google некоторые пакеты библиотек, которые обрабатывают байты.
Использование чего-то вроде Erlang привносит неэффективность, зависимости и другой багаж, который вам, вероятно, не нужен с низкоуровневой библиотекой.
Что ж, если скорость не имеет значения, и вам нужен Perl, тогда преобразуйте каждую строку двоичного кода в строку символов - нулей и единиц. Да, я знаю, что в двоичном формате нет перевода строки :), но, по-видимому, у вас есть какой-то фиксированный размер - например, по байтам или другим единицам, с помощью которых вы можете разбить двоичный blob.
Затем просто используйте обработку строки perl на эти данные :)
Форт тоже может неплохо справляться с этим, но это немного загадочно.
Модуль Python bitstring был написан для этой цели. Он позволяет делать произвольные фрагменты двоичных данных и предлагает ряд различных интерпретаций через свойства Python. Он также предоставляет множество инструментов для создания и изменения двоичных данных.
Например:
>>> from bitstring import BitArray, ConstBitStream
>>> s = BitArray('0x00cf') # 16 bits long
>>> print(s.hex, s.bin, s.int) # Some different views
00cf 0000000011001111 207
>>> s[2:5] = '0b001100001' # slice assignment
>>> s.replace('0b110', '0x345') # find and replace
2 # 2 replacements made
>>> s.prepend([1]) # Add 1 bit to the start
>>> s.byteswap() # Byte reversal
>>> ordinary_string = s.bytes # Back to Python string
Есть также функции для побитового чтения и навигации в цепочке битов, как в файлах; на самом деле это можно сделать прямо из файла, не считывая его в память:
>>> s = ConstBitStream(filename='somefile.ext')
>>> hex_code, a, b = s.readlist('hex:32, uint:7, uint:13')
>>> s.find('0x0001') # Seek to next occurence, if found
True
Существуют также представления с разными порядками байтов, а также возможность менять порядок байтов и многое другое - см. руководство .