DataGrid не будет отображаться в диалоговом окне Авалонии.C#

Место общения программистов C#
Ответить
Anonymous
 DataGrid не будет отображаться в диалоговом окне Авалонии.

Сообщение Anonymous »

Я создаю приложение Avalonia, руководствуясь рекомендациями MVVM Community Toolkit. Одна из функций приложения включает открытие диалогового окна, содержащего DataGrid, показывающего список языковых ключей и переводов на пять языков. Эти данные загружаются из файла JSON, и каждый файл может иметь разные языки, поэтому все столбцы DataGrid, кроме первого, генерируются во время загрузки. Затем пользователь выбирает строку, и ее данные используются основной моделью представления после закрытия диалогового окна.
Моя проблема в том, что, хотя контекст данных для диалогового окна и его DataGrid кажется правильно заполненным списком в ObservableCollection и даже регистрирует выбранную строку, сам DataGrid никогда не виден. Я делаю во многом то же самое, что и предыдущее приложение, самое большое отличие состоит в том, что DataGrid находился в главном окне, а не в диалоговом окне.
Если кратко, нажатие кнопки в главном окне дает команду основной модели представления отправить сообщение в код основной части окна, чтобы открыть диалоговое окно. Контекст данных диалога инициализируется переводами, полученными от модели основного представления, которая сохраняет список после загрузки его из файла. Диалоговое окно получает команду заполнить столбцы языка в DataGrid, а затем открывается. После закрытия диалога основная модель представления слышит ответ кода программной части, содержащий необходимые ей данные.
Используемые пакеты:
Изображение

Translations.json:

Код: Выделить всё

[
{
"Key": "LangOrder",
"Xl8ns": [ "en-US", "fr-FR", "es-ES", "de-DE", "it-IT" ]
},
{
"Key": "LangNames",
"Xl8ns": [ "English", "Français", "Español", "Deutsch", "Italiano" ]
},
{
"Key": "AccumulationArea",
"Xl8ns": [ "Accumulation Area", "Zone d'accumulation", "Zona de acumulación", "Beschleunigungsbereich", "Area di accumulo" ]
},
{
"Key": "Color",
"Xl8ns": [ "Color", "Couleur", "Color", "Farbe", "Colore" ]
},
{
"Key": "Quality",
"Xl8ns": [ "Quality", "Qualité", "Calidad", "Qualität", "Qualità" ]
}
]
MainWindow.xaml: MainWindow.axaml.cs (после использования и пространства имен):

Код: Выделить всё

public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
WeakReferenceMessenger.Default.Register(this, OpenPickLanguageKeyDialog());
}

private static MessageHandler OpenPickLanguageKeyDialog() {
return static (w, m) => {
var dlgVM = new PickLanguageKeyResultVM(m.Translations, m.CurrentKey);
var dialog = new TranslationsGridDlg {
Title = "Pick Language Key",
DataContext = dlgVM
};
dialog.InitLanguageColumns(dlgVM.Translations[0]);
// Show dialog window and reply with returned PickLanguageKeyResultVM or null when the dialog is closed
m.Reply(dialog.ShowDialog(w));
};
}
}
MainWindowViewModel.cs:

Код: Выделить всё

public partial class MainWindowViewModel : ViewModelBase {
[ObservableProperty]
private string _pickedLangKey = "PickSomething";

private List _translations = [];

public MainWindowViewModel() {
var transJSON = File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Assets\Translations.json"));
_translations = JsonConvert.DeserializeObject(transJSON);
}

[RelayCommand]
private async Task PickLanguageKeyAsync() {
var langKeyPick = await WeakReferenceMessenger.Default.Send(new PickLanguageKeyMessage(_translations, PickedLangKey));

if (langKeyPick != null) {
PickedLangKey = langKeyPick.SelectedTranslation == null ? "NoSelection"  : langKeyPick.SelectedTranslation.Key;
} else {
PickedLangKey = "FAIL";
}
}
}
PickLanguageKeyResultVM.cs:

Код: Выделить всё

public partial class PickLanguageKeyResultVM : ObservableRecipient {
public ObservableCollection Translations { get; set; } = [];
[ObservableProperty]
private TranslationVM? _selectedTranslation;

public PickLanguageKeyResultVM(List translations, string currentKey) {
var loadedLanguages = translations.First().Translations;
Translations.Clear();

foreach (var entry in translations) {
if (entry.Key != Constants.KEY_LANGUAGE_ORDER) {
var trans = new TranslationVM {
Key = entry.Key
};

for (var l = 0; l < entry.Translations.Count; l++) {
trans.LangVals.Add(new LanguageValueVM {
Language = loadedLanguages[l],
Value = entry.Translations[l]
});
}

Translations.Add(trans);
}
}

SelectedTranslation = Translations.FirstOrDefault(t => t.Key == currentKey.Trim());

if (SelectedTranslation == null) {
SelectedTranslation = Translations[2];  // Color
}
}

[RelayCommand]
public void PickKey() {
WeakReferenceMessenger.Default.Send(new PickLanguageKeyClosedMessage(this));
}

[RelayCommand]
public void CancelPick() {
WeakReferenceMessenger.Default.Send(new PickLanguageKeyClosedMessage(null));
}
}

public class PickLanguageKeyMessage(List translations, string currentKey) : AsyncRequestMessage {
public string CurrentKey { get; } = currentKey;
public List Translations { get; set; } = translations;
}

public class PickLanguageKeyClosedMessage(PickLanguageKeyResultVM? userResult) {
public PickLanguageKeyResultVM? UserResult { get; } = userResult;
}
TranslationsGridDlg.axaml: TranslationsGridDlg.axaml.cs:

Код: Выделить всё

public partial class TranslationsGridDlg : Window {
public TranslationsGridDlg() {
InitializeComponent();
WeakReferenceMessenger.Default.Register(
this, static (w, m) => w.Close(m.UserResult));
}

public void InitLanguageColumns(TranslationVM topEntry) {
for (var li = 0; li < topEntry.LangVals.Count; li++) {
var column = new DataGridTextColumn {
Header = topEntry.LangVals[li].Language,
Binding = new Binding($"LangVals[{li}].Value")
};

dtgTranslations.Columns.Add(column);
}
}
}
TranslationKey.cs:

Код: Выделить всё

[DataContract]
public class TranslationKey {
[DataMember]
public string Key { get; set; } = Constants.KEY_LANGUAGE_ORDER;

[DataMember]
[JsonProperty("Xl8ns")]   // Save some JSON file space
public List Translations { get; set; } = [];
}
TranslationVM.cs:

Код: Выделить всё

[DataContract]
public class TranslationVM {
[DataMember]
public string Key { get; set; } = string.Empty;

[DataMember]
public List LangVals { get; set; } = [];

public List GetLanguagesOrder() {
var allLanguages = new List();

foreach (var langVal in LangVals) {
allLanguages.Add(langVal.Language);
}

return allLanguages;
}

public List GetValuesList() {
var allTranslations = new List();

foreach (var langVal in LangVals) {
allTranslations.Add(langVal.Value);
}

return allTranslations;
}
}

[DataContract]
public class LanguageValueVM : ViewModelBase {
[DataMember]
public string Language { get; set; }

[DataMember]
public string Value { get; set; }
}
Constants.cs:

Код: Выделить всё

public class Constants {
public const string KEY_LANGUAGE_ORDER = "LangOrder";
public const string KEY_LANGUAGE_NAMES = "LangNames";
public const string LANGUAGE_ENGLISH = "en-US";
public const string LANGUAGE_FRENCH = "fr-FR";
public const string LANGUAGE_SPANISH = "es-ES";
public const string LANGUAGE_GERMAN = "de-DE";
public const string LANGUAGE_ITALIAN = "it-IT";
}
Что я делаю не так? Заранее спасибо.


Подробнее здесь: https://stackoverflow.com/questions/798 ... nia-dialog
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»