Контакты
Местоположение
Россия, Москва и Московская обл., Москва

Наибольший вклад в теги

Все теги (22)

Лучшие ответы пользователя

Все ответы (25)
  • Как перенести метод для кнопок в отдельный класс в WPF?

    @Jewish_Cat
    Увлекаюсь C#
    Изучай паттер MVVM и его используй.

    Пример:
    Код взял из боевого решения. Если будет непонятно, спрашивайте
    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));
            }
        }
    Ответ написан
  • Есть ли какие-нибудь тестовые задания на многопоточность и асинхронность, C#/ASP.NET?

    @Jewish_Cat
    Увлекаюсь C#
    Советую почитать: Конкурентность в C#. Асинхронное, параллельное и многопоточное программирование | Клири Стивен
    Ответ написан
  • Как организовать постоянное обновление DataGrid в отдельном потоке?

    @Jewish_Cat
    Увлекаюсь C#
    Тут два выхода:
    1)сделать бинд datasource на переменную и обновлять эту переменную, тогда не будет проблемы с потоками(нужно использовать MVVM)
    2)изменять datasource с помощью dispatcher
    Ответ написан
  • Настрока Nginx и Apache, насткройка модуля upstream?

    @Jewish_Cat
    Увлекаюсь C#
    Если по простому, то у тебя будет одна тачка(сервер) на нём Nginx с настроенным upstream для сайта test.ru
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
    }
    
    server {
    
        server_name test.ru;
        location / {
            proxy_pass http://backend;
        }
    }

    И плюс 3 тачки на каждой установлен apache и работает один и тот же сайт.
    Этот конфиг nginx самый простой. На офф.сайте в документации всё понятно и подробно описаны все опции
    Ответ написан