Я пытаюсь включить пример из документации Avalonia в свой тестовый проект, но я застрял в попытке использовать mainwindowviewmodel < /strong> также как code-behind для mainwindow (mainwindow.axaml.cs)
Пример-последний на https://docs.aloniaui.net/docs/ ссылка/элементы управления/combobox, что, к сожалению, немного устаревшей.
Код: Выделить всё
using Avalonia.Controls;
using Avalonia.Media;
using System.Linq;
namespace AvaloniaControls.Views
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
fontComboBox.Items = FontManager.Current
.GetInstalledFontFamilyNames()
.Select(x => new FontFamily(x))
.OrderBy(x=>x.Name);
fontComboBox.SelectedIndex = 0;
}
}
}
< /code>
Mainwindow имеет несколько других элементов управления с использованием модели представления MVVM < /p>
x:DataType="vm:MainWindowViewModel"
< /code>
Поэтому, когда я введите {привязку} Rider полезно напоминает мне с '(mainwindowviewmodel). Path = '< /em>
Я также узнал, что при использовании термина «привязка» это должно быть с свойством - если, возможно, это не в коде.
(что просто Сделаю голову, когда я пытаюсь заполнить, в данном случае, Combobox.) Данные, которые я ожидаю) < /p>
public List lFonts = new List();
public MainWindow()
{
InitializeComponent();
ColourComboBox.ItemsSource = ColourBasesTxt;
ThemesComboBox.ItemsSource = Themes;
IFontCollection allFonts = FontManager.Current.SystemFonts;
foreach (var font in allFonts)
{
lFonts.Add(font.Name);
}
FontComboBox.ItemsSource = lFonts;
< /code>
Теперь то, что я не могу тренироваться, это как связать это с XAML. Пример кода был < /p>
< /code>
в моем коде < /p>
< /code>
Теперь < /p>
< /code>
не работает, потому что он пытается связываться с mainwindowviewmodel.name
Я попробовал много сумасшедших предложений, чтобы получить контекст данных в DataTemplate, чтобы быть кодом- позади.
Все, кроме 1, не проходили проверку синтаксиса.
Я не могу переориентировать весь Combobox, потому что «SelectedItem» должен быть на свойство в MainwindowViewModel (что это есть). < /p>
Тот, кто приблизился, - < /p>
Мне жаль, что я настолько новичок в этом методе, что мне даже не хватает языка, чтобы правильно сформулировать вопрос. Используйте «Источник» (код, поставляющий содержимое списка) в одном модуле и «SelectedItem» в другом модуле. » «Как вы можете указать DataContext, чтобы стать кодом, стоящим за модулем для любого данного XAML» < /em> < /p>
Спасибо за терпение
jc < /p>
Добавление полный код для вырезанной версии. Любой автоматический сгенерированный код был оставлен в
mainwindow.axaml
Код: Выделить всё
< /code>
mainwindow.axaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using Avalonia.Controls;
using Avalonia.Fonts.Inter;
using Avalonia.Media;
using Avalonia.Media.Fonts;
namespace Colour_Font_experiment3v1_snip.Views;
public partial class MainWindow : Window
{
private string[] Themes = new string[] { "Dark", "Light" };
private List lFonts = new List();
public MainWindow()
{
InitializeComponent();
ThemesComboBox.ItemsSource = Themes;
IFontCollection allFonts = FontManager.Current.SystemFonts;
foreach (var font in allFonts)
{
Console.WriteLine(font.Name);
lFonts.Add(font.Name);
}
Console.WriteLine($"{lFonts.Count} font Names loaded");
FontComboBox.ItemsSource = lFonts;
FontComboBox.SelectedIndex = 0;
}
}
< /code>
mainwindowviewmodel < /p>
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reactive;
using Avalonia;
using Avalonia.Interactivity;
using ReactiveUI;
using Romzetron.Avalonia;
namespace Colour_Font_experiment3v1_snip.ViewModels;
public class MainWindowViewModel : ViewModelBase
{
// *****************************************************************
private string _dummyPlaceHolder = "Under Construction!";
public string DummyPlaceHolder
{
get => _dummyPlaceHolder;
set => this.RaiseAndSetIfChanged(ref _dummyPlaceHolder, value);
}
public ReactiveCommand SaveButtonClick { get; }
private string _selectedTheme = "Light";
public string SelectedTheme
{
get => _selectedTheme;
set => this.RaiseAndSetIfChanged(ref _selectedTheme, value);
}
private string _selectedFont;
public string SelectedFont
{
get => _selectedFont;
set => this.RaiseAndSetIfChanged(ref _selectedFont, value);
}
private string _startFolder = @"M:\Museum\ManagedCatalog";
public string StartFolder
{
get => _startFolder;
set => this.RaiseAndSetIfChanged(ref _startFolder, value);
}
// **********************************************************
// Constructor
public MainWindowViewModel()
{
SaveButtonClick = ReactiveCommand.Create(PerformSaveAction);
DummyPlaceHolder = "Current Colour Base is : 'redacted' " ;
}
private void PerformSaveAction()
{
Console.WriteLine("The \'Set / Save\' button was pressed.");
}
//*******************************************
private ColorTheme getCurrentTheme()
{
return GetRomzetronAvaloniaTheme().ColorTheme;
}
// **********************************************************
// JC added from https://github.com/Romzetron/Romzetron.Avalonia?tab=readme-ov-file
private static RomzetronTheme? GetRomzetronAvaloniaTheme()
{
// Get a reference to the current application.
if (Application.Current is not App app)
return null;
// Loop through the styles in the application.
foreach (var style in app.Styles)
{
// Return RomzetronTheme if it is found.
if (style is RomzetronTheme theme)
return theme;
}
return null;
}
}
< /code>
и просто на перефокусировку. Проблема состоит в том, чтобы получить линию XAML < /p>
Еще раз спасибо
jc
Подробнее здесь: https://stackoverflow.com/questions/793 ... given-xaml