Wpf数据绑定参数问题

时间:2018-06-10 22:17:01

标签: c# wpf data-binding

我正在使用c#和wpf。

我遇到DataBinding问题。 我有这个模型基类:

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 :(得分:1)

一般来说,如果你不得不求助于在转换器之类的东西中使用逻辑,那么通常一个好的迹象就是你的视图模型不能正常工作。这是一个很好的例子,因为你直接使用模型而根本不使用视图模型。绑定应该无声地失败而不会产生异常,这表明它是在转换器中生成的。如果您要在视图中执行逻辑,那么我可能会抛弃转换器并使用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,但你也可以使用它来附加Source绑定,只有当它不是null时。