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

Rom*_*mbé 0 c# data-binding wpf xaml datatemplate

编辑

这不是字符串空值的回退的重复。我要求对复杂类型进行回退。

原始问题

这是我昨天问的一个问题的后续问题:

将 WPF 命令绑定到 C# XAML 中的 ViewModel 属性

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

<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>
Run Code Online (Sandbox Code Playgroud)

ADataTemplate是为自定义类型创建的,然后将 aContentControl绑定到该类型的属性。

现在的问题是,属性(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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

<view:PathSelectorConverter x:Key="pathSelectorConverter"/>
Run Code Online (Sandbox Code Playgroud)

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

但是转换器仅在值不为空时才被调用

Rom*_*mbé 5

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

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

<ContentControl Content="{Binding MyPathSelector,
                          FallbackValue={StaticResource FallbackPathSelector}}"/>
Run Code Online (Sandbox Code Playgroud)