Wpf Ошибка привязки данных - PullRequest
0 голосов
/ 11 июня 2018

Я использую c # и wpf.

У меня проблема с привязкой данных.У меня есть базовый класс этой модели:

public class Media
{
  public string Text {get;set;}
  public List<string> Videos{get;set;}
  public List<string> Images{get;set;}
}

вот мой код xaml:

<Grid Height="500" Width="380">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <TextBlock Text="{Binding Text, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" TextAlignment="Center" VerticalAlignment="Center"/>

    <Image Grid.Row="1" Source="{Binding Images[0], Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Visibility="{Binding Converter={StaticResource imageVisibilityConverter}}"/>

    <MediaElement Grid.Row="1" Source="{Binding Videos[0], Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Visibility="{Binding Converter={StaticResource videoVisibilityConverter}}"/>
</Grid>

В моей модели представления списка мультимедиа некоторые из моих моделей не имеют видео и видео.ноль (или не имеет элемента).В связывающем источнике MediaElement я поставил [0] значение видео, которое вызывает исключение.

Исключение:

System.Windows.Data Error: 17 : Cannot get 'Item[]' value (type 'XXXX') from 'Videos' (type 'List`1'). BindingExpression:Path=Videos[0]; DataItem='Media' (HashCode=18855696); target element is 'MediaElement' (Name=''); target property is 'Source' (type 'Uri') ArgumentOutOfRangeException:'System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: index'

Я хочу проверить, доступны ли видео, установите для Видео [0] значениеСвойство источника MediaElement, если нет, не устанавливайте для этого свойства ничего.

Любая помощь будет полезна.

1 Ответ

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

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

<Image Grid.Row="1">
        <Image.Style>
            <Style TargetType="Image">
                <Setter Property="Visibility" Value="Visible" />
                <Style.Triggers>
                     <!-- Hide when Images is null -->
                    <DataTrigger Binding="{Binding Images}" Value="{x:Null}">
                        <Setter Property="Visibility" Value="Hidden" />
                    </DataTrigger>
                     <!-- Hide when Images[0] is null -->
                    <DataTrigger Binding="{Binding Images[0]}" Value="{x:Null}">
                        <Setter Property="Visibility" Value="Hidden" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Image.Style>
    </Image>

Я делаю это для Visibility здесь, но вы также можетеиспользуйте его, чтобы прикрепить привязку источника, только когда она не равна нулю.

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