Обязательный фон с путем строки - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь привязать строку (путь к png) в ViewModel к фону сетки. Эта строка может быть нулевой. Это работает хорошо, но в выходных cmd

System. Windows .Data Ошибка: 23: Не удалось преобразовать '' из типа '' в тип 'System. Windows .Media.ImageSource' для культура en-US с конверсиями по умолчанию; рассмотрите возможность использования конвертера

Как я могу привязать путь строки к фону, чтобы избежать этой ошибки? Моя текущая привязка: FieldControl.CS:

        public string BackgroundPath
    {
        get
        {
            return (string)GetValue(BackgroundPathProperty);
        }
        set
        {
            SetValue(BackgroundPathProperty, value);
        }
    }

    public static readonly DependencyProperty BackgroundPathProperty =
        DependencyProperty.Register("BackgroundPath", typeof(string), typeof(FieldControl), new PropertyMetadata(null));

FieldControl.XAML:

        <Grid.Background>
        <ImageBrush
            ImageSource="{
                    Binding Path=BackgroundPath,  
                    Mode=OneWay, 
                    UpdateSourceTrigger=PropertyChanged, 
                    RelativeSource={
                                    RelativeSource Mode=FindAncestor, 
                                    AncestorType={x:Type UserControl}
                                   }
                 }" />

    </Grid.Background>

И в MainWindow.XAML:

        <ItemsControl
        ItemsSource="{Binding FieldsVM}">

        ...

        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <controls:FieldControl
                    BackgroundPath="{Binding Path=BackgroundPath }"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>

    </ItemsControl>

1 Ответ

1 голос
/ 29 апреля 2020

Один из способов удалить ошибку из компилятора - это создать IValueConverter и использовать в элементе ImageBru sh, как рекомендует компилятор.

IValueConverter может писать так:

[ValueConversion(typeof(string), typeof(ImageSource))]
public class StringToImageSourceConverter : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        if (value == null) return null;

        var path = value.ToString();
        return new BitmapImage(new Uri(path, UriKind.RelativeOrAbsolute));
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        throw new NotSupportedException();
    }
}

и в xaml FieldControl:

<UserControl.Resources>
    <local:StringToImageSourceConverter x:Key="StringToImageSourceConverter" />
</UserControl.Resources>

<Grid Height="100">
    <Grid.Background>
        <ImageBrush ImageSource="{Binding Path=BackgroundPath, Mode=OneWay, UpdateSourceTrigger=PropertyChanged, ElementName=Uc1, 
                    Converter={StaticResource StringToImageSourceConverter}}" />
    </Grid.Background>
</Grid>

После этого вы не должны видеть ошибку от компилятора.

Я тестирую код в this проект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...