bool _isCalculated;
public bool IsCalc
get
{
return _isCalculated;
}
set{
if (value != _isCalculated)
{
_isCalculated = value;
SaveMeInDbMethod(_isCaluclated);
// TODO: посмотреть в гугл NotifyPropertyChanged или RaisePropertyChanged() в VievModel
NotifyPropertyChanged("IsCalc");
}
DataSet dataSet = new DataSet();
string filePath = Application.StartupPath + "\\dataset.xml";
private void Form1_Shown(object sender, EventArgs e)
{
// Проверяем наличие файла, если на месте, то загружаем из него наш dataSet
if (File.Exists(filePath))
{
dataSet.ReadXml(filePath);
}
// Если отсутствует, создадим файл с простой структурой для 1 строки
else
{
using (XmlWriter writer = XmlWriter.Create("dataset.xml"))
{
writer.WriteStartElement("Data");
writer.WriteStartElement("rows");
writer.WriteElementString("Type", "");
writer.WriteElementString("Category", "");
writer.WriteElementString("Date", "" + DateTime.Now.ToString("dd.mm.yyy") + "");
writer.WriteElementString("Summ", "0");
writer.WriteElementString("Total", "0");
writer.WriteElementString("Comment", "");
writer.WriteEndElement();
writer.WriteEndElement();
writer.Flush();
}
}
// Заполняем датагрид
DataGridFill(dataSet);
//Подписываемся на событие добавление новой строки
dataGridView1.RowsAdded += new DataGridViewRowsAddedEventHandler(RowsAdded);
}
<?xml version="1.0" standalone="yes"?>
<Data>
<rows>
<Type />
<Category />
<Date>06.03.2020</Date>
<Summ>0</Summ>
<Total>0</Total>
<Comment />
</rows>
</Data>
private void Add_button_Click(object sender, EventArgs e)
{
string empty = "";
string date = DateTime.Now.ToString("dd.mm.yyyy");
if (dataGridView1.Columns.Count != 0)
{
dataSet.Tables[0].Rows.Add(new object[] { empty, empty, date, empty, empty, empty });
dataGridView1.Update();
}
else
MessageBox.Show("Ошибка: Невозможно добавить строку в таблицу, в которой отсутствуют колонки",
"Ошибка",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
dataGridView1.RowsAdded += new DataGridViewRowsAddedEventHandler(RowsAdded);
private void DataGridFill(DataSet dataSet)
{
if (dataSet != null)
{
dataGridView1.DataSource = dataSet.Tables[0];
for(int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
{
if (string.IsNullOrEmpty(dataSet.Tables[0].Rows[i][4].ToString()))
ataSet.Tables[0].Rows[i][4] = 0;
}
for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
{
if (i != 0 && !string.IsNullOrEmpty(dataSet.Tables[0].Rows[i][3].ToString()))
dataSet.Tables[0].Rows[i][4] = Convert.ToDouble(dataSet.Tables[0].Rows[i - 1][4]) + Convert.ToDouble(dataSet.Tables[0].Rows[i][3]);
else if (!string.IsNullOrEmpty(dataSet.Tables[0].Rows[i][3].ToString()))
dataSet.Tables[0].Rows[i][4] = dataSet.Tables[0].Rows[i][3];
}
}
dataGridView1.Columns[0].HeaderText = "Тип";
dataGridView1.Columns[1].HeaderText = "Категория";
dataGridView1.Columns[2].HeaderText = "Дата";
dataGridView1.Columns[3].HeaderText = "Сумма";
dataGridView1.Columns[4].HeaderText = "Итого";
dataGridView1.Columns[5].HeaderText = "Комментарий";
}
<TabControl b:TabContent.IsCached=“True”>
</TabControl>
byte[] message = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00, 0x00 }; // Последние 2 байта под CRC, заполняем нолями
byte[] CRC = (new byte[2]);
GetCRC data = new GetCRC();
data._GetCRC(message, ref CRC); // для этого примера CRC будет равно 0xDDBA, т.е. BA DD
byte[] message_out = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, CRC[0], CRC[1] };
class GetCRC
{
// -----------------------------------------------------------------------------
//Возвращает двухбайтовую контрольную сумму. + Алгоритм расчета CRC
// -----------------------------------------------------------------------------
public void _GetCRC(byte[] message, ref byte[] CRC) // входные данные функции : byte[] message(см. строчку где message.Length)- это данные которые пришли в функцию,
// входные данные функции: ref byte[] CRC - эти данные мы получаем внутри этой функции и потом выводим в тело
// программы откуда мы вызвали эту ффункцию
{
ushort CRCFull = 0xFFFF; // 16-ти битовый регистр загружается числом FF hex (все 1), и используется далее как регистр CRC
char CRCLSB; // переменная определения значения младшего бита в цикле
for (int i = 0; i < (message.Length) - 2; i++) //Повторяются шаги для следующего сообщения(1). Это повторяется до тех пор пока все байты сообщения не будут обработаны.
{
CRCFull = (ushort)(CRCFull ^ message[i]); // Первый байт сообщения (- 2 это отсекаем место под CRC) складывается по ИСКЛЮЧАЮЩЕМУ ИЛИ
// с содержимым регистра CRC. Результат помещается в регистр CRC
for (int j = 0; j < 8; j++) // цикл повторяется 8 раз
{
CRCLSB = (char)(CRCFull & 0x0001); // Если младший бит 0. Повторяется сдвиг (следующая строка).
CRCFull = (ushort)((CRCFull >> 1) & 0x7FFF); // Регистр CRC сдвигается вправо(в направлении младшего бита) на 1 бит, старший бит заполняется 0
if (CRCLSB == 1) // Если младший бит 1
CRCFull = (ushort)(CRCFull ^ 0xA001); // Делается операция ИСКЛЮЧАЮЩЕЕ ИЛИ регистра CRC и полиномиального числа A001 hex
}
}
CRC[1] = (byte)((CRCFull >> 8) & 0xFF); // определяем получившийся старший байт
CRC[0] = (byte)(CRCFull & 0xFF); // определяем получившийся младший байт
}
}
с чего начать?
<TextBox x:Name="CategoryText"
TextChanged="ChangeText"
Style="{StaticResource CategoryTextBox}" />
public partial class FontWindow : Window
{
private MainWindow window;
public FontWindow(MainWindow mainWindow)
{
InitializeComponent();
window = mainWindow;
}
private void ChangeText(object sender, TextChangedEventArgs e)
{
TextBox tb = sender as TextBox;
window.CategoryLabel1.Content = tb.Text;
}
}
dd:DragDrop.IsDragSource="True"
dd:DragDrop.IsDropTarget="True"
Если вы столкнулись с проблемой при использовании какой-то библиотеки, то задавайте конкретный вопрос с ней связанный, приводя минимально воспроизводимый пример. В противном случае начинается гадание на кофейной гуще.
public class MainVM
{
private IEnumerable<FileInfo> GetFiles() =>
Directory.EnumerateFiles(Directory.GetCurrentDirectory())
.Select(path => new FileInfo(path));
public MainVM()
{
FileList = new ObservableCollection<FileInfo>(GetFiles());
}
public FileInfo CurrentFile { get; set; }
public ObservableCollection<FileInfo> FileList { get; }
}
xmlns:dd="urn:gong-wpf-dragdrop"
<ListBox
dd:DragDrop.IsDragSource="True"
dd:DragDrop.IsDropTarget="True"
ItemsSource="{Binding FileList}"
SelectedItem="{Binding CurrentFile}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock VerticalAlignment="Center" Text="{Binding Name}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
double a = 3;
double step = 0.1;
for (double x = 0; x < 2 * a - 1; x += step)
{
var n = x * x * x;
var d = 2 * a - x;
chart1.Series[0].Points.AddXY(x, Math.Sqrt(n / d));
chart1.Series[1].Points.AddXY(x, -Math.Sqrt(n / d));
}
public partial class SetColdBalance : Window
{
public SetColdBalance()
{
InitializeComponent();
}
}
public class RelayCommand<T> : ICommand
{
#region Fields
readonly Action<T> _execute = null;
readonly Predicate<T> _canExecute = null;
#endregion
#region Constructors
/// <summary>
/// Initializes a new instance of <see cref="DelegateCommand{T}"/>.
/// </summary>
/// <param name="execute">Delegate to execute when Execute is called on the command. This can be null to just hook up a CanExecute delegate.</param>
/// <remarks><seealso cref="CanExecute"/> will always return true.</remarks>
public RelayCommand(Action<T> execute)
: this(execute, null)
{
}
/// <summary>
/// Creates a new command.
/// </summary>
/// <param name="execute">The execution logic.</param>
/// <param name="canExecute">The execution status logic.</param>
public RelayCommand(Action<T> execute, Predicate<T> canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute");
_execute = execute;
_canExecute = canExecute;
}
#endregion
#region ICommand Members
///<summary>
///Defines the method that determines whether the command can execute in its current state.
///</summary>
///<param name="parameter">Data used by the command. If the command does not require data to be passed, this object can be set to null.</param>
///<returns>
///true if this command can be executed; otherwise, false.
///</returns>
public bool CanExecute(object parameter)
{
return _canExecute == null ? true : _canExecute((T)parameter);
}
///<summary>
///Occurs when changes occur that affect whether or not the command should execute.
///</summary>
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
///<summary>
///Defines the method to be called when the command is invoked.
///</summary>
///<param name="parameter">Data used by the command. If the command does not require data to be passed, this object can be set to <see langword="null" />.</param>
public void Execute(object parameter)
{
_execute((T)parameter);
}
#endregion
}
<Window x:Class="AdminTool.SetColdBalance"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:local="clr-namespace:AdminTool"
mc:Ignorable="d"
Title="Задать баланс"
Height="150"
Width="250"
ResizeMode="NoResize"
WindowStartupLocation="CenterScreen"">
<Window.DataContext>
<local:ColdWalletViewModel/>
</Window.DataContext>
<Grid>
<Button Grid.Row="2" Width="100" Height="30" Content="Save" Command="{Binding SaveColdWallets}"/>
</Grid>
</Window>
public class ColdWalletViewModel : BindableBase
{
ICommand _saveColdWallet;
public ICommand SaveColdWallets
{
get
{
return _saveColdWallet ?? (_saveColdWallet = new RelayCommand<object[]>((obj) =>
{
///Тут пишешь что должна выполнять твоя кнопка
}), /*Тут можно написать условие при котором можно будет выполнить данную команду*/);
}
}
}
/// <summary>
/// Implementation of <see cref="INotifyPropertyChanged" /> to simplify models.
/// </summary>
public abstract class BindableBase : INotifyPropertyChanged
{
/// <summary>
/// Multicast event for property change notifications.
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
/// <summary>
/// Checks if a property already matches a desired value. Sets the property and
/// notifies listeners only when necessary.
/// </summary>
/// <typeparam name="T">Type of the property.</typeparam>
/// <param name="storage">Reference to a property with both getter and setter.</param>
/// <param name="value">Desired value for the property.</param>
/// <param name="propertyName">
/// Name of the property used to notify listeners. This
/// value is optional and can be provided automatically when invoked from compilers that
/// support CallerMemberName.
/// </param>
/// <returns>
/// True if the value was changed, false if the existing value matched the
/// desired value.
/// </returns>
protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
{
if (Equals(storage, value))
{
return false;
}
storage = value;
this.OnPropertyChanged(propertyName);
return true;
}
/// <summary>
/// Notifies listeners that a property value has changed.
/// </summary>
/// <param name="propertyName">
/// Name of the property used to notify listeners. This
/// value is optional and can be provided automatically when invoked from compilers
/// that support <see cref="CallerMemberNameAttribute" />.
/// </param>
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}