2013-11-15 41 views
1

我有一個UserControl,它具有一個ComboBox並綁定到它自己的某個依賴項屬性。ComboBox SelectedItem綁定將NULL寫入源屬性

<UserControl x:Class="XamlParserComboBoxTest.ItemEditor" x:Name="aEditor"> 
    <Grid> 
     <ComboBox Grid.Row="1" 
       DisplayMemberPath="Name" 
       ItemsSource="{Binding Path=Colors}" 
       SelectedItem="{Binding ElementName=aEditor, 
             Path=Item.Color, 
             Mode=TwoWay}"/> 

    </Grid> 
</UserControl> 

這DependencyProperty的充滿Item類型的實例:

public class Item : ViewModelBase 
{ 
    private Color _color { get; set; } 
    public Color Color 
    { 
     get { return _color; } 
     set 
     { 
      _color = value; 
      if (value == null) 
      { 
       Console.WriteLine("Color set to NULL"); 
      } 
      Console.WriteLine(value); 
      OnPropertyChanged("Color"); 
     } 
    } 
} 

public class Color 
{ 
    public string Name { get; set; } 
} 

當用戶控件被替換爲另一個用戶控件,該項目的Color setter方法被調用NULL值。綁定到其他控件的屬性不會有任何變化。

雖然我已經解決了這個問題,但我真的需要了解是什麼原因造成的,以及解決問題的最佳方法。

編輯:根據堆棧跟蹤,空值來自Item's基類,但我不知道如何。完整的源代碼可用here。要重現該問題,請啓動它並按兩次「顯示項目」按鈕。

+0

你的意思是什麼,當UserControl被替換爲另一個UserControl? 「ItemsSource」來自哪裏? –

+0

@HighCore,請檢查源代碼。我只在窗口中心顯示一個編輯器控件,將ContentControl的內容綁定到由我的ICommand實現設置的屬性。 –

回答

0

你可以使用TargetNullValue和可能FallbackValue性嘗試是這樣的:

<ComboBox DisplayMemberPath="Name" ItemsSource="{Binding Path=Colors}" 
    SelectedItem="{Binding ElementName=aEditor, Path=Item.Color, 
    TargetNullValue=Black, FallbackValue=Black, Mode=TwoWay}" /> 
+0

據我所知,這隻影響綁定的組合框項目端,而他在另一端有問題... –

+0

啊,謝謝你指出。 – Sheridan

0

你可以把一個斷點,你有消息框,並檢查調用堆棧。然後你會知道誰在設置null。

那麼你可能會使用'JustDecompile'這樣的工具來找出原因。如果你不習慣在這裏發佈調用堆棧,我會爲你做。

+0

謝謝SoMoS。你能解釋一下JustDecompile如何幫助我嗎?鑑於這個名字,我認爲這是一個反編譯器...... –

+0

當你有堆棧跟蹤可用,那麼你將能夠知道爲什麼null被設置,然後你知道如何避免它。 –

+0

我已經上傳了源代碼。同時,我想了解您提出的建議,但不知道如何爲JustDecompile提供堆棧跟蹤... –

相關問題