Создание и привязка свойств OnPropertyChanged во время выполнения C#
Я знаю, что я не использую чистый MVVM, но это мой случай:
Во время выполнения я создаю динамический список Grids
, каждый Grid
содержит Label
и Textbox
, Я хотел бы связать Text
ценность каждого Textbox
так что когда я меняю его в UI
соответствующее свойство изменится соответственно.
Тем не менее, у меня нет этих свойств, как TextBoxes
создаются динамически, поэтому я не знаю заранее, сколько TextBoxes
будет ли у меня и что они представляют.
Следовательно, я хочу динамически создавать Properties
какой бросок OnPropertyChanged
событие и динамически связать их с TextBoxes
на создание.
Я читаю о dynamic
а также ExpandoObject
но я не совсем уверен, что это правильный подход.
Можно ли это сделать?
Прикрепление некоторого кода:
private ObservableCollection<Grid> m_labelsGrid = new ObservableCollection<Grid>();
public ObservableCollection<Grid> LabelsGrid
{
get => m_labelsGrid;
set
{
m_labelsGrid = value;
OnPropertyChanged();
}
}
foreach (var currentFreeText in m_labelsConfig.FreeText)
{
var newGrid = new Grid();
var labelColumnDefinition = new ColumnDefinition { Width = new GridLength(0.4, GridUnitType.Star) };
var valueDefinition= new ColumnDefinition { Width = new GridLength(0.6, GridUnitType.Star) };
var marginDefinition = new ColumnDefinition { Width = new GridLength(10) };
newGrid.ColumnDefinitions.Add(labelColumnDefinition);
newGrid.ColumnDefinitions.Add(valueDefinition);
newGrid.ColumnDefinitions.Add(marginDefinition);
var newLabel = new Label
{
Content = labelHeader,
ToolTip = labelHeader,
};
newGrid.Children.Add(newLabel);
Grid.SetColumn(newLabel, 0);
var newTextBox = new TextBox();
(labelContainer as Control).Foreground = Brushes.DarkGreen;
(labelContainer as Control).FontWeight = FontWeights.Bold;
(labelContainer as Control).HorizontalAlignment = HorizontalAlignment.Stretch;
(labelContainer as Control).HorizontalContentAlignment = HorizontalAlignment.Center;
(labelContainer as Control).VerticalAlignment = VerticalAlignment.Center;
(labelContainer as Control).VerticalContentAlignment = VerticalAlignment.Center;
newGrid.Children.Add(labelContainer as Control);
Grid.SetColumn(labelContainer as Control, 1);
LabelsGrid.Add(newGrid);
newTextBox.Text = currentFreeText.Value;
}