Используйте StringBuilder, и класс Separator
StringBuilder buf = new StringBuilder();
Separator sep = new Separator(", ");
for (String each : list) {
buf.append(sep).append(each);
}
Разделитель обертывает разделитель. Разделитель возвращается методом Разделителя toString
, если на первом вызове, который возвращает пустую строку!
Исходный код для класса Separator
public class Separator {
private boolean skipFirst;
private final String value;
public Separator() {
this(", ");
}
public Separator(String value) {
this.value = value;
this.skipFirst = true;
}
public void reset() {
skipFirst = true;
}
public String toString() {
String sep = skipFirst ? "" : value;
skipFirst = false;
return sep;
}
}
Если вы следите за статьей Джоша Смита о MVVM , он использует шаблоны данных для представлений, а не пользовательские элементы управления. Если вы поместите свои DataTemplates в ResourceDictionaries, у них вообще не будет кода программной части. Если вы не используете код программной части своего пользовательского элемента управления, разве это не означает, что вы можете использовать подход DataTemplate? Если вы это сделаете, WPF позаботится о привязке вашего представления к вашей модели представления за вас.
Пробовали ли вы использовать это из чистого любопытства:
x:Subclass="Control"
По умолчанию для UserControls требуется вызов InitializeComponent (), а для стандартных элементов управления - нет. Мне было бы интересно узнать, работает ли это.
-Дуг
В качестве другого варианта, если вы не хотите полностью использовать DataTemplates, вот альтернативный подход для UserControls:
Используйте атрибут x: Code для встраивания конструктора вызовите в XAML:
<x:Code><![CDATA[ public MyClass() { InitializeComponent(); }]]></x:Code>
Эрик
Я обсуждал этот вопрос с членом команды Windows Client на PDC, и прямо сейчас мне сказали, что не существует официально поддерживаемого способа полностью удалить код, стоящий за файлом. Как видите, его можно скомпилировать, но InitializeComponent ()
никогда не вызывается, поэтому элемент управления не настраивается должным образом.
Атрибут x: Subclass «использование в первую очередь предназначено для языков, которые не поддерживают объявления частичных классов». Это не предназначалось для такого поведения (к сожалению).