В качестве доказательства концепции я написал это небольшое приложение для тестирования этих динамических привязок. Я пытаюсь использовать ExpandoObject для инкапсуляции тех динамических свойств, к которым я привязываюсь к динамически создаваемым элементам управления. К сожалению, ни одно динамически созданное свойство не обновляется в соответствии со своим динамически созданным полем.
Мое главное окно содержит:
Код: Выделить всё
```
Код: Выделить всё
using Avalonia.Controls;
using DynamicBindingControls.ViewModels;
namespace DynamicBindingControls.Views {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
private void btnCreateDynamicControls_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e) {
var dynaSettings = new DynamicSettingsGroup();
dynaSettings.DataContext = new DynamicSettingsGroupVM("Dynamism!");
dynaSettings.CreateDynamicSettings();
stpSettingsGroups.Children.Add(dynaSettings);
}
}
}
Код: Выделить всё
Код: Выделить всё
using Avalonia.Controls;
using Avalonia.Data;
using System.Collections.Generic;
namespace DynamicBindingControls.Views;
public partial class DynamicSettingsGroup : UserControl {
public DynamicSettingsGroup() {
InitializeComponent();
}
public void CreateDynamicSettings() {
var myDC = DataContext as ViewModels.DynamicSettingsGroupVM;
// Use string indexing to add properties to the ExpandoObject
var props = myDC.DynamicSettingsProperties as IDictionary;
props["DynaProp"] = "Brand new";
var settingField = new TextBox {
[!TextBox.TextProperty] = new Binding("DynamicSettingsProperties.DynaProp")
};
stpDynamicFields.Children.Add(settingField);
}
}
Код: Выделить всё
using CommunityToolkit.Mvvm.ComponentModel;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Dynamic;
namespace DynamicBindingControls.ViewModels;
public partial class DynamicSettingsGroupVM : ViewModelBase {
[ObservableProperty]
private string _name;
public dynamic DynamicSettingsProperties { get; set; } = new ExpandoObject();
public DynamicSettingsGroupVM(string aName) {
Name = aName;
((INotifyPropertyChanged)DynamicSettingsProperties).PropertyChanged +=
new PropertyChangedEventHandler(HandlePropertyChanges);
}
private void HandlePropertyChanges(
object? sender, PropertyChangedEventArgs e) {
var dict = DynamicSettingsProperties as IDictionary;
Trace.WriteLine($"{e.PropertyName} has changed to {dict[e.PropertyName]}.");
}
}
Код: Выделить всё
DynaProp has changed to Brand new.
[Binding]An error occurred binding 'Text' to 'DynamicSettingsProperties.DynaProp' at 'DynaProp': 'Could not find a matching property accessor for 'DynaProp' on 'System.Dynamic.ExpandoObject'.' (TextBox #1589866)

Все помощь оценена по достоинству.