2017-06-29 2 views
0

EDITSet Standardwert in XAML, wenn die Bindung null ist

Dies ist kein Duplikat eines Ausweich für String-Null-Werte. Ich frage nach einem Fallback für einen komplexen Typ.

Original Frage

Dies ist ein Followup Frage auf eine Frage, die ich gestern gefragt haben:

Bind WPF Command to ViewModel property in C# XAML

Der Kernteil der akzeptierte Antwort auf mich war:

<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> 

Ein DataTemplate wird für einen benutzerdefinierten Typ und die erstellt n a ContentControl ist an eine Eigenschaft dieses Typs gebunden.

Das Problem ist jetzt, dass die Eigenschaft (FirstPath10 in dem Beispiel) null sein kann und keine UI-Elemente gerendert werden. Wie konnte ich erreichen die Steuerelemente aus dem DataTemplate selbst zu machen, wenn die Eigenschaft null

ist als Evk schlug ich einen Converter implementiert haben:

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(); 
    } 
} 

Ich habe eine Ressource eine Instanz des Wandlers hinzugefügt mein Fenster:

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

Und fügte hinzu, es in der auf die Eigenschaft Bindung:

Aber der Konverter wird nur aufgerufen, wenn der Wert nicht null ist

+0

Can not Stellen Sie sicher, dass es niemals null ist? – Evk

+0

@Evk Leider nicht. Ich habe eine Liste von Elementen, aus denen Sie auswählen können, und jedes Element hat eine 'FirstPath'-Eigenschaft. Wenn die Liste der Elemente leer ist, habe ich dieses unerwünschte Verhalten. –

+0

Dann können Sie einen Konverter verwenden, der eine Standardinstanz von SettingsPathSelectorViewModel zurückgibt, wenn der angegebene Wert null ist. – Evk

Antwort

3

ich die Antwort auf dieses Problem in einer anderen question von mir (Der Code von Clemens ist) gefunden: Sie

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

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