Содержимое метки WPF показывает DependencyProperty.UnsetValue в режиме разработки - PullRequest
0 голосов
/ 29 июня 2018

У меня есть метка WPF, и я связал некоторые данные в строку, используя StringFormat из xaml:

<Label Grid.Row="0" Grid.Column="1" Style="{StaticResource MyLblResource}">
    <Label.Content>
        <TextBlock VerticalAlignment="Center">
            <TextBlock.Text>
                <MultiBinding StringFormat="{}({0}) {1}">
                    <Binding Path="MyDataModel.Id" />
                    <Binding Path="MyDataModel.Desc" />
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
    </Label.Content>
</Label>

Вышеупомянутый код работает нормально, никаких проблем, но во время разработки, в представлении xaml, в содержимом TextBlock оно отображается:

{{DependecyProperty.UnsetValue}} {{DependencyProperty.UnsetValue}}

Почему это показывается вместо того, чтобы быть пустым? Есть ли способ показать это как пустое?

1 Ответ

0 голосов
/ 29 июня 2018

Это должно сработать:

 public class StringFormatConverter : MarkupExtension, IMultiValueConverter
    {
        public string StringFormat { get; set; } = @"({0}) {1}";

        public string PlaceHolder { get; set; } = "Empty";

        public override object ProvideValue(IServiceProvider serviceProvider) => this;

        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            return string.Format(StringFormat, GetValues(values));
        }

        private IEnumerable<string> GetValues(object[] values)
        {
            foreach (var value in values)
                yield return value == DependencyProperty.UnsetValue || value == null ? PlaceHolder : value.ToString();
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            return new[] { Binding.DoNothing, Binding.DoNothing };
        }
    }

Используйте это так:

 <MultiBinding Converter="{converter:StringFormatConverter PlaceHolder=MyPlaceHolderText}">
   <Binding Path="MyDataModel.Id" />
   <Binding Path="MyDataModel.Desc" />
</MultiBinding>

Обратите внимание, что вы можете установить значения static только в StringFormat и PlaceHolder - потому что они не DependencyProperty.

...