#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 в этом случае. В этом посте Лоран Буньон приводит ряд примеров того, как создавать и использовать данные времени разработки