Это - просто я, или действительно ли WPF является путаницей привязки данных и пользовательского IValueConverters?

Использование строки $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
};

Этот метод не будет работать во всех ситуациях, но его легко реализовать.

7
задан Domenic 19 July 2009 в 15:56
поделиться

3 ответа

Ваш подход совершенно верен (хотя я бы использовал мульти-привязку для второго примера, а не такой специализированный конвертер), хотя помещая всю свою логику в 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. (также, если вы работаете в среде, где есть дизайнеры, отвечающие за внешний вид, и разработчики, отвечающие за поведение, это помогает определить эти границы)

В конце концов, хотя эта логика действительно должна куда-то идти, и пока есть лучшие и худшие способы спроектировать ваше приложение, вы по-прежнему будете писать код, который берет строку и где-то преобразует ее в серию имен файлов и значков.

10
ответ дан 6 December 2019 в 08:45
поделиться

Не знаю, ошиблись ли вы, просто сделать это намного сложнее, чем должно быть!

Я использую MVVM, поэтому, когда вы пишете преобразователи клиентов, я предоставляю связываемый Свойство модели представления, которое сообщает представлению, что делать. Например:

  1. Чтобы отобразить список файлов, я предоставляю коллекцию, содержащую этот список.
  2. Если мне нужны значки, объект в этой коллекции имеет свойство значка
  3. Если я хочу, чтобы статус был красным или зеленый Я предоставляю свойство StatusColorbrush.

Перенося эту логику в модель представления, я получаю:

  1. гораздо более простой Xaml.
  2. могу проверить мою логику представления без представления.

В этом подходе используется один из сильные стороны WPF - его возможности связывания.

5
ответ дан 6 December 2019 в 08:45
поделиться

Во-первых, вы можете начать с чтения о шаблоне Модель-Представление-Модель представления (MVVM). Джош Смит недавно опубликовал в журнале MSDN фантастическую статью . MVVM и WPF прекрасно сочетаются друг с другом. Если все сделано правильно, вам не понадобятся IValueConverters так . То, как вы это делаете сейчас, вызывает очень тесную связь между вашей визуализацией и действиями вашего приложения. MVVM предназначен для разделения этих элементов.

В этом контексте ваша модель представления будет отслеживать состояние за вас. Ваша кнопка будет активна, если метод CanExecute для определенной ICommand в вашей модели представления вернет true. Эта же концепция может обрабатывать отключение кнопки при обработке чего-либо.

Вы хотите отобразить список файлов в определенном каталоге, который указан внутри списка? Имейте модель представления DirectoryViewModel , которая будет обрабатывать предоставление списка файлов для представления путем привязки к модели представления. Отображение файлов можно указать с помощью DataTemplate , указанного в XAML без кода. Эта же концепция может обрабатывать предоставление значков для представления, отображение которого может быть указано в шаблоне.

Вы хотите, чтобы ваш статус был красным, если сообщение о состоянии содержит «Ошибка», и зеленым в противном случае? Позвольте модели представления определять состояние и позволить представлению связываться с этим состоянием, и теперь вам понадобится только IStateConverter , чтобы преобразовать состояние в красный или зеленый соответственно (это один из многих способов решения этой проблемы в контекст MVVM).

6
ответ дан 6 December 2019 в 08:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: