Вникаю в WPF и MVVM. С начало написал так:
private void Button_Click(object sender, RoutedEventArgs e)
{
if(String.IsNullOrEmpty(txtAccountLogin.Text) || String.IsNullOrEmpty(txtAccountPassword.Text))
{
MessageBox.Show("Все поля должны быть заполнены!", "Ошибка!", MessageBoxButton.OK, MessageBoxImage.Error);
}
else
{
using (Cursor = Cursors.Wait)
{
using (AccountContext ac = new AccountContext())
{
Account account = new Account();
account.login = txtAccountLogin.Text;
account.password = txtAccountPassword.Text;
ac.Accounts.Add(account);
ac.SaveChanges();
MessageBox.Show("Аккаунт " + account.login + " добавлен.", "Сообщение", MessageBoxButton.OK, MessageBoxImage.Information);
txtAccountLogin.Text = "";
txtAccountPassword.Text = "";
}
}
}
}
Но потом понял что код не должен знать ничего о интерфейсе. Вопрос, мне нужно создать модель "account", наследовать его INotifyPropertyChanged
сделать event
изменений полей. Потом надо сделать AccountViewModel
и в нем и дальше я не понимаю что дальше. По клику кнопки к чему мне обратиться что получить текст из контролов? Правильно ли я понимаю что из за события изменения биндинг будет контрола будет так же изменять и состояние свойства? Вот мой пример как сделал с DataGrid
:
class Message: INotifyPropertyChanged
{
public string author { get; set; }
public string message { get; set; }
public string bulletinText { get; set; }
public int id { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
}
class MessageViewModel: INotifyPropertyChanged
{
private Message Message { get; set; }
public ObservableCollection<Message> Messages { get; set; }
public MessageViewModel()
{
Messages = new ObservableCollection<Message>
{
new Message{ author = "Федор Иванович", bulletinText = "Привет, как дела?", message = "Продам собаку", id = 154 },
new Message{ author = "Меткий снайпер", bulletinText = "Сообщите номер накладной?", message = "Доставка овощей", id = 255}
};
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName]string prop = "")
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
}
public Main()
{
InitializeComponent();
DataContext = new MessageViewModel();
}
XAML:
<DataGrid CanUserAddRows="False" ItemsSource="{Binding Messages}" DockPanel.Dock="Top" AutoGenerateColumns="False" HorizontalAlignment="Stretch" VerticalScrollBarVisibility="Auto" VerticalAlignment="Stretch" Margin="5,0,0,0" MouseDoubleClick="DataGrid_MouseDoubleClick">
<DataGrid.Columns>
<DataGridTextColumn Header="От кого" Binding="{Binding Path=author}" Width="*" IsReadOnly="True" />
<DataGridTextColumn Header="Сообщение" Binding="{Binding Path=message}" Width="*" IsReadOnly="True" />
<DataGridTextColumn Header="Превью объявления" Binding="{Binding Path=bulletinText}" Width="*" IsReadOnly="True" />
</DataGrid.Columns>
</DataGrid>
Вот так отлавливаю событие клика:
private void DataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
DataGrid grid = (DataGrid)sender;
int id = (grid.SelectedItem as Message).id;
MessageBox.Show(id.ToString());
}
Как сделать в первой части моего вопроса?
Виртуальный выделенный сервер (VDS) становится отличным выбором
на строку MySqlDataReader reader1 = command1ExecuteReader(); выдается ошибка System
При получении содержимого сайта playgoogle