Как указать значение времени разработки для silverlight textblock, которое привязано к свойству viewmodel?

#silverlight #data-binding #mvvm #textblock

#silverlight #привязка к данным #mvvm #textblock

Вопрос:

В моем XAML есть текстовый блок, текст которого привязан к свойству в моей viewmodel.

 <TextBlock x:Name="SomeText" Text="{Binding TheTextProperty}" />
  

Это работает нормально, но во время разработки viewmodel отсутствует, поэтому свойство неразрешимо, а текст остается пустым. С этим сложно работать в конструкторе, потому что он не показывает видимый текст.

Как я могу указать некоторый текст по умолчанию для использования во время разработки?

Ответ №1:

Может быть, вы могли бы попробовать

 <TextBlock x:Name="SomeText" Text="{Binding TheTextProperty, FallbackValue='Some other text'}" />
  

как задокументировано здесь.

Комментарии:

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

2. @Mike: Я тоже сначала подумал об этом, но MSDN говорит , какое значение использовать, когда привязка не может вернуть значение. Я также опробовал это, и использование null для значения привязки не приводит к FallbackValue отображению (резервный вариант null может быть указан с помощью TargetNullValue )

Ответ №2:

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

Сначала вы создаете свой DataContext в xaml. Добавьте новый Xml-документ в свое решение (корень — подходящее место) и дайте ему расширение .xaml. Давайте назовем этот файл «foo.xaml» для этого примера.

В этом файле удалите весь XML и начните создавать экземпляр вашего типа DataContext. Например, если ваш DataContext был строкой (очень простой пример), ваш файл выглядел бы следующим образом:

 <string xmlns="clr-namespace:System;assembly=mscorlib">LOL!</string>
  

У вас может быть ваш вид

 <ViewModel xmlns="clr-namespace:MyNamespace">
    <ViewModel.MyObservableCollection>
         <MyModel Name="foo" />
         <!-- etc -->
  

Задайте для действия сборки для этого файла значение DesignDataWithDesignTimeCreatableTypes:

введите описание изображения здесь

Далее, по вашему мнению, добавьте следующие пространства имен и свойства в корень вашего Window / UserControl:

 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DataContext="{d:DesignData Source=foo.xaml}"
  

Source относится к текущему документу. Итак, если ваше решение выглядело как

  • Число просмотров
    • MyUserControl.xaml
  • Данные
    • foo.xaml

вы бы установили Source значение ../Data/foo.xaml .

Существуют другие способы создания контекста DesignData в зависимости от того, может ли ваша ViewModel быть создана во время разработки и т.д.

Комментарии:

1. Это тоже очень интересный подход. Выглядит довольно полезным для сложных данных времени разработки. Определенно стоит добавить в закладки!

Ответ №3:

Другой вариант — использовать свойства DesignerProperties.Получите функцию indesignmode, чтобы определить, размещен ли элемент управления в VS / Blend, и сгенерируйте поддельный DataContext в этом случае. В этом посте Лоран Буньон приводит ряд примеров того, как создавать и использовать данные времени разработки