Как часто вы собираетесь это делать; если вы действительно хотите массив, вы должны использовать массив . В противном случае, да, функция, которая создает новый список, состоящий из копии первых N элементов, нового элемента и хвоста, будет в порядке. Я не знаю, какая встроенная функция у меня в голове, но я давно не программировал на Лиспе.
Вот решение в Схеме (потому что я знаю это лучше, чем Common Lisp, и у меня есть переводчик для проверки моей работы):
(define (replace-nth list n elem)
(cond
((null? list) ())
((eq? n 0) (cons elem (cdr list)))
(#t (cons (car list) (replace-nth (cdr list) (- n 1) elem)))))
Связывание действительно подходит:
XAML:
<UserControl x:Class="testapp.LabelTextBox "
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300" x:Name="This">
<DockPanel>
<TextBlock DockPanel.Dock="Left" TextAlignment="Right" Width="70" Name="label" Text="{Binding Label, ElementName=This}" />
<TextBlock Text=": " DockPanel.Dock="Left" />
<TextBox Name="textBox" Text="{Binding Text, ElementName=This}" />
</DockPanel>
Отложенный код:
public partial class LabelTextBox : UserControl
{
public LabelTextBox()
{
InitializeComponent();
Label = "Label";
Text = "Text";
}
public static readonly DependencyProperty LabelProperty = DependencyProperty.Register("Label", typeof(string), typeof(LabelTextBox), new FrameworkPropertyMetadata(LabelPropertyChangedCallback));
private static void LabelPropertyChangedCallback(DependencyObject controlInstance, DependencyPropertyChangedEventArgs args)
{
}
public string Label
{
get { return (string) GetValue(LabelProperty); }
set { SetValue(LabelProperty, value); }
}
public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(LabelTextBox), new FrameworkPropertyMetadata(TextPropertyChangedCallback));
private static void TextPropertyChangedCallback(DependencyObject controlInstance, DependencyPropertyChangedEventArgs args)
{
}
public string Text
{
get { return (string) GetValue(TextProperty); }
set { SetValue(LabelTextBox.TextProperty, value); }
}
}
Я не разбирался, почему ваша реализация не работает, но я действительно не понимаю, почему вы делаете это именно так. Почему бы просто не определить необходимые свойства зависимостей в UserControl, а затем привязать к ним?
public static readonly DependencyProperty LabelTextProperty = ...;
А затем в вашем XAML:
<Label Content="{Binding LabelText}"/>