我有這種結合麻煩:綁定到的HasValue對空類型的Silverlight的DataGrid
<sdk:DataGridCheckBoxColumn Header="Invoiced" Binding="{Binding SalesInvoiceId.HasValue}" />
的錯誤是: System.Windows.Data錯誤:BindingExpression路徑錯誤:未發現「的HasValue」屬性'6''System.Int32'(HashCode = 6)。 BindingExpression:Path ='SalesInvoiceId.HasValue'DataItem ='Entities.DeliveryNote'(HashCode = 5034835);目標元素是'System.Windows.Controls.CheckBox'(Name ='');目標屬性是'IsChecked'(類型'System.Nullable`1 [System.Boolean]')。
字段SalesInvoiceId位於該行的數據上下文中,所有其他列綁定正常。
SalesInvoiceId的類型是int?
。並且在調試時查看對象時,它顯示爲int?
,所以DataGrid應該沒有問題 - 但它是指它只是一個int
!
有什麼我做錯了嗎?
很多謝謝。
回答
一開始我嘗試了的IValueConverter使用反射來尋找HasValue屬性和調用它,不幸的是傳遞的值參數仍然是一個普通的老int類型。
我現在有以下幾點:
public class HasValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value != null;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
和XAML:
<sdk:DataGridCheckBoxColumn Header="Invoiced" Binding="{Binding SalesInvoiceId, Converter={StaticResource HasValueConverter}}" />
我看,問題是我將業務實體(DeliveryNote)直接綁定到該行,並且添加另一個屬性意味着要創建一個代理對象並將所有值傳輸過來......我想知道是否有某種方法爲了避免這一點。我喜歡Silverlight和MVVM - 但有時候它看起來很辛苦! – James 2011-05-04 13:17:58
啊,我明白了,轉換器可能仍然可以保存你的皮膚! – dain 2011-05-04 13:42:29
好的建議,問題依然存在,因爲傳遞給IValueConverter的值是'int'類型。我不知道它爲什麼會改變int的值?整數 – James 2011-05-04 13:49:25