2017-06-29 144 views
0

编辑设置默认值,如果绑定为null

这不是字符串空值回退的副本。我正在寻求复杂类型的后备。

原来的问题

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

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> 

A DataTemplate是为自定义类型创建的, n a 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"/> 

并将其添加在绑定的属性:

但是,如果值不为空

+0

你能不能确保它不是null而是? – Evk

+0

@Evk不幸的是没有。我有一个可以选择的元素列表,每个元素都有一个'FirstPath'属性。如果元素List是空的,我有这种不希望的行为。 –

+0

然后,您可以使用转换器,如果提供的值为null,将返回SettingsPathSelectorViewModel的某个默认实例。 – Evk

回答

3

我找到了答案,这个问题在我的另一个question(代码是从克莱门斯)转换器只叫:

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

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