2016-04-04 5 views
7

TargetNullValue soll die Bindung Target aktualisieren, wenn die Bindung Source ausgewertet null:Warum TargetNullValue Update nullable Quelle

Ruft den Wert, der in dem Ziel verwendet wird, wenn der Wert der Quelle null ist .

Zusätzlich zu, dass es scheint auch die Source zu null (falls möglich) zu setzen, wenn der Wert von Target ist gleich zu TargetNullValue gegeben. Mit anderen Worten, es stellt effektiv eine Äquivalenz zwischen null und der TargetNullValue Wert der Eigenschaft. Dies wird jedoch in der Dokumentation überhaupt nicht erwähnt.

Sehen Sie folgendes Beispiel:

<Window x:Class="WPF_Sandbox.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WPF_Sandbox" 
     Title="MainWindow" 
     x:Name="ThisControl"> 
    <StackPanel x:Name="MainStackPanel"> 
     <TextBox x:Name="MyTextBox" Text="{Binding NullableInt, ElementName=ThisControl, TargetNullValue='', UpdateSourceTrigger=PropertyChanged}" /> 
    </StackPanel> 
</Window> 


public partial class MainWindow : Window 
{ 
    private int? nullableInt; 

    public int? NullableInt 
    { 
     get { return nullableInt; } 
     set { nullableInt = value; } 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 
} 

Hinweis: UpdateSourcetrigger wird nur gesetzt Prüfung leichter zu machen und hat nichts mit der Wirkung in Frage zu tun.

Wenn Sie einen Haltepunkt in NullableInt ‚s Setter setzen, können Sie sehen, dass es ausgelöst wird (mit value == null), wenn Sie den TextBox Inhalt '' ändern.

Ist dies ein undokumentiertes Verhalten von TargetNullValue oder gibt es andere Nebenwirkung im Spiel?

Edit: ich auf dieses Thema gestoßen, weil ich auf diese Frage suchte:
Set value to null in WPF binding

Antwort

9

Es scheint Verhalten nicht dokumentiert werden. Wenn Sie bei BindingExpressionBase.GetRawProposedValue() aussehen, wenn der Wert retreiving zu verwenden, überprüft es tatsächlich zu sehen, ob der Wert auf die TargetNullValue gleich ist und wenn ja, verwendet null statt:

internal virtual object GetRawProposedValue() 
{ 
    object value = Value; 

    // TargetNullValue is the UI representation of a "null" value. Use null internally. 
    if (Object.Equals(value, EffectiveTargetNullValue)) 
    { 
     value = null; 
    } 

    return value; 
} 

(wo EffectiveTargetNullValue ist letztlich die TargetNullValue).

Wenn Sie Ihren TargetNullValue statt einer leeren Zeichenfolge auf 5 setzen, sehen Sie, dass die Eigenschaft 5 die Eigenschaft auf null zurücksetzt.