Существует структура, называемая ReactiveUI - она использует ReactiveExtensions и наблюдаемые, чтобы упростить жизнь MVVM.
У вас нет глубокого погружения и вы используете весь каркас, но у него есть четкая концепция Взаимодействие :
public class ViewModel : ReactiveObject
{
private readonly Interaction confirm;
public ViewModel()
{
this.confirm = new Interaction();
}
public Interaction Confirm => this.confirm;
public async Task DeleteFileAsync()
{
var fileName = ...;
// this will throw an exception if nothing handles the interaction
var delete = await this.confirm.Handle(fileName);
if (delete)
{
// delete the file
}
}
}
public class View
{
public View()
{
this.WhenActivated(
d =>
{
d(this
.ViewModel
.Confirm
.RegisterHandler(
async interaction =>
{
var deleteIt = await this.DisplayAlert(
"Confirm Delete",
$"Are you sure you want to delete '{interaction.Input}'?",
"YES",
"NO");
interaction.SetOutput(deleteIt);
}));
});
}
}
Вы можете просто сосредоточиться на взаимодействиях.
Я бы также рекомендовал ReactiveCommand, чтобы избежать проблем с кнопками и асинхронными действиями.
Быть очень ясным. Случай нажатия кнопки происходит после события Page_Load, означающего, что фильтрация не становится прикладной на первой обратной передаче. Это было обновлено на второй обратной передаче, и Вы видите фильтрацию. Самое простое изменение, чтобы заставить Ваш код работать состоит в том, чтобы переместить весь код в Ваше событие Page_Load в OnPreRender, таким образом, перезагрузка происходит после события нажатия кнопки.
Более чистое решение однако состоит в том, чтобы, вероятно, переместить его в функцию LoadData и вызов, что на PageLoad, когда это не обратная передача и также называет его на событии нажатия кнопки после обновления Ваших фильтров. Это предотвратит вызов к базе данных по любым циклам страницы обратной передачи, которые не должны перезагружать данные:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
LoadData()
}
}
private void LoadData()
{
labDownloadList.Text = null;
//Session variables:
if (Session["Game"] != null)
...
}
protected void btnFilter_Click(object sender, EventArgs e)
{
game = lstGames.SelectedValue;
modtype = lstTypeMod.SelectedValue;
filter = true;
LoadData();
}
Последняя часть быстрого совета для подающего надежды разработчика ASP.NET должна полностью изучить жизненный цикл страницы. Знание последовательности событий на странице важно.Удачи.
Обзор Microsoft Жизненного цикла Страницы может быть полезным в понимании потока (и решение Вашего вопроса).
Обработчики событий нажатия кнопки происходят ПОСЛЕ Page_Load. Попытайтесь использовать Page_LoadComplete вместо этого.
Так, в Вашем коде, когда-то кнопка нажата, page_load событие запускает и устанавливает данные, затем btnClick событие запускает и изменяет данные. Но, данные были уже связаны в, он - старая форма. Вот почему требуется 2 щелчка для него для работы.
При помещении того же кода page_load в page_loadcomplete событие вместо этого, это произойдет после btnClick события. Это должно привести к желаемому результату.
JackCom, решение работало!Спасибо. И я изучу жизненный цикл страницы. Я должен добавить, что у меня только есть опыт в разработке программного обеспечения, я только что запустил с веб-разработки этой осенью.
Я не вижу типичное
if (!Page.IsPostBack)
{
...
}
в Вашем методе Page_Load, что означает, что Ваш datbinding произойдет каждый раз, страница загружается, наиболее вероятное порождение Вашей проблемы. Я предложил бы добавить, что к коду и видят, решает ли он вопрос.