Использование строки $index
может помочь использовать хэш-карту выбранных значений:
<ul>
<li ng-repeat="someItem in someArray">
<input type="checkbox" ng-model="someObject[$index.toString()]" />
</li>
</ul>
Таким образом, объект ng-модели обновляется ключом, представляющим индекс.
$scope.someObject = {};
Через некоторое время $scope.someObject
должно выглядеть примерно так:
$scope.someObject = {
0: true,
4: false,
1: true
};
Этот метод не будет работать во всех ситуациях, но его легко реализовать.
Ваш подход совершенно верен (хотя я бы использовал мульти-привязку для второго примера, а не такой специализированный конвертер), хотя помещая всю свою логику в XAML, вы создаете очень сильную связь между тем, как выглядит приложение, и тем, как оно ведет себя, из-за этого вы можете захотеть изучить шаблон MVVM, чтобы отделить эти вещи.
Под Шаблон MVVM ваш XAML (представление) просто содержит очень простые привязки данных к ViewModel, который обрабатывает всю логику и обновляет представление через интерфейс INotifyPropertyChanged. Код для вашего третьего примера может выглядеть примерно так:
public class DirectoryManagerViewModel : INotifyPropertyChanged
{
private string _directory;
public string Directory
{
get { reutrn _directory; }
set
{
if (_directory != value)
{
_directory = value;
OnPropertyChanged("Directory");
if (IsValidDirectory(value))
{
PopulateFiles();
}
}
}
}
public ObservableCollection<FileViewModel> Files { get; private set; }
private bool IsValidDirectory(string directory)
{
//return if the directory exists etc.
}
private bool PopulateFiles()
{
//Populate Files with files in directory
}
}
Где FileViewModel - это другая модель представления, которая содержит имя и значок файла.
Преимущество этого подхода в том, что ViewModels можно повторно использовать с другими представлениями и другими технологиями, такими как ASP.NET или Winforms, поэтому вы не заблокированы в стеке WPF. (также, если вы работаете в среде, где есть дизайнеры, отвечающие за внешний вид, и разработчики, отвечающие за поведение, это помогает определить эти границы)
В конце концов, хотя эта логика действительно должна куда-то идти, и пока есть лучшие и худшие способы спроектировать ваше приложение, вы по-прежнему будете писать код, который берет строку и где-то преобразует ее в серию имен файлов и значков.
Не знаю, ошиблись ли вы, просто сделать это намного сложнее, чем должно быть!
Я использую MVVM, поэтому, когда вы пишете преобразователи клиентов, я предоставляю связываемый Свойство модели представления, которое сообщает представлению, что делать. Например:
Перенося эту логику в модель представления, я получаю:
В этом подходе используется один из сильные стороны WPF - его возможности связывания.
Во-первых, вы можете начать с чтения о шаблоне Модель-Представление-Модель представления (MVVM). Джош Смит недавно опубликовал в журнале MSDN фантастическую статью . MVVM и WPF прекрасно сочетаются друг с другом. Если все сделано правильно, вам не понадобятся IValueConverters
так . То, как вы это делаете сейчас, вызывает очень тесную связь между вашей визуализацией и действиями вашего приложения. MVVM предназначен для разделения этих элементов.
В этом контексте ваша модель представления будет отслеживать состояние за вас. Ваша кнопка будет активна, если метод CanExecute
для определенной ICommand
в вашей модели представления вернет true. Эта же концепция может обрабатывать отключение кнопки при обработке чего-либо.
Вы хотите отобразить список файлов в определенном каталоге, который указан внутри списка? Имейте модель представления DirectoryViewModel
, которая будет обрабатывать предоставление списка файлов для представления путем привязки к модели представления. Отображение файлов можно указать с помощью DataTemplate
, указанного в XAML без кода. Эта же концепция может обрабатывать предоставление значков для представления, отображение которого может быть указано в шаблоне.
Вы хотите, чтобы ваш статус был красным, если сообщение о состоянии содержит «Ошибка», и зеленым в противном случае? Позвольте модели представления определять состояние и позволить представлению связываться с этим состоянием, и теперь вам понадобится только IStateConverter
, чтобы преобразовать состояние в красный или зеленый соответственно (это один из многих способов решения этой проблемы в контекст MVVM).