如果绑定为null,则在XAML中设置默认值

时间:2017-06-29 12:10:18

标签: c# wpf xaml data-binding datatemplate

修改

这与字符串空值的回退无关。我要求复杂类型的后备。

原始问题

这是我昨天问过的问题的后续问题:

Bind WPF Command to ViewModel property in C# XAML

我接受的答案的核心部分是:

<Window.Resources>
    <DataTemplate DataType="{x:Type local:SettingsPathSelectorViewModel}">
        <StackPanel Orientation="Horizontal">
            <TextBox Text="{Binding SettingsPath}" />
            <Button 
                Content="..." 
                Command="{Binding OpenFile}" 
                HorizontalAlignment="Left" 
                MinWidth="40" 
                Margin="4,0,0,0" 
                />
        </StackPanel>
    </DataTemplate>
</Window.Resources>
<Grid>
    <StackPanel Orientation="Vertical">
        <Label>First Path</Label>
        <ContentControl Content="{Binding FirstPath}" />
    </StackPanel>
</Grid>

为自定义类型创建DataTemplate,然后将ContentControl绑定到该类型的属性。

现在的问题是,属性(示例中的FirstPath)可能是null,并且没有呈现UI元素。即使属性为DataTemplate

,如何从null呈现控件也是如此

正如Evk建议我实现了转换器:

public class PathSelectorConverter : IValueConverter
{
    public object Convert(object o, Type type, object parameter, CultureInfo culture)
    {
        return o ?? new PathSelector();
    }
    public object ConvertBack(object o, Type type, object parameter, CultureInfo culture)
    {
        return o ?? new PathSelector();
    }
}

我在我的窗口中添加了转换器的一个实例:

<view:PathSelectorConverter x:Key="pathSelectorConverter"/>

并将其添加到属性的绑定中:

但只有当值不为空时才调用转换器

1 个答案:

答案 0 :(得分:3)

我在另一个question找到了这个问题的答案(代码来自Clemens):

<Window.Resources>
    <model:PathSelector x:Key="FallbackPathSelector" />
</Window.Resources>
...

<ContentControl Content="{Binding MyPathSelector,
                          FallbackValue={StaticResource FallbackPathSelector}}"/>