大量的ASP.NET數據綁定控件公開了一個EmptyDataTemplate,當控件綁定到一個空的數據源時,它將被呈現。在我的WP7應用程序中,當綁定到ListBox的數據源爲空時,我也希望顯示友好的消息。有沒有一個合理的優雅的方式來實現這一目標?最好與caliburn.micro集成/WP7相當於EmptyDataTemplate?
謝謝!
大量的ASP.NET數據綁定控件公開了一個EmptyDataTemplate,當控件綁定到一個空的數據源時,它將被呈現。在我的WP7應用程序中,當綁定到ListBox的數據源爲空時,我也希望顯示友好的消息。有沒有一個合理的優雅的方式來實現這一目標?最好與caliburn.micro集成/WP7相當於EmptyDataTemplate?
謝謝!
不知道caliburn.micro,但例如,如果你綁定到一個ObservableCollection<T>
(在我看來,最好的綁定到任何東西),有CollectionChanged
事件處理程序。
這麼說:
ObservableCollection<string> c = new ObservableCollection<string>();
c.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(c_CollectionChanged);
這裏,在事件處理程序本身,你可以檢查觸發集合是否爲空:
void c_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (((ObservableCollection<string>)sender).Count == 0)
{
// Action here
}
}
有沒有這樣的功能,開箱即用在Silverlight。
什麼但是你可以做的是建立一個與TextBlock
正確的消息,並將其綁定的知名度ListBox
的的ItemsSource使用轉換器。該轉換器應返回Visibility.Visible
當計數> 0和Visibility.Collapsed
當計數== 0。
我不喜歡使用後面的代碼來實現這樣的功能。我寧願推薦實現一個可用於綁定標記的DataTemplateConverter來實現這個確切的功能。
的爲例:
<ContentControl ContentTemplate="{Binding Converter={StaticResource templateConverter}, Path=yourbindingpath}"/>
轉換器將在XAML文件的資源節被實例化。
<myControls:EmptyDataTemplateConverter x:Key="templateConverter">
<myControls:EmptyDataTemplateConverter.NonEmpty>
<DataTemplate>[...]</DataTemplate>
</myControls:EmptyDataTemplateConverter.NonEmpty>
<myControls:EmptyDataTemplateConverter.Empty>
<DataTemplate>[...]</DataTemplate>
</myControls:EmptyDataTemplateConverter.Empty>
</myControls:EmptyDataTemplateConveter>
在這種情況下,Empty/NonEmpty實現由您決定。
如果您想了解如何實現這樣一個ValueConverter,看到MSDN(或谷歌)
樣品添加。你可以使用DataTemplate的依賴屬性,但爲了簡潔起見,我在這裏提到了這個。
public class EmptyDataTemplateConverter: IValueConverter
{
public DataTemplate Empty{get;set;}
public DataTemplate NonEmpty{get;set;}
// This converts the DateTime object to the DataTemplate to use.
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
if(IsEmpty(value))
{
return this.Empty;
}
else
{
return this.NonEmpty;
}
}
//Your "empty/not empty" implementation here. Mine is rather... incomplete.
private bool IsEmpty(object value)
{
return value!=null;
}
// No need to implement converting back on a one-way binding
public object ConvertBack(object value, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
編輯: 實現同一個目標的其他方式,但多在「Silverlight的方式」一點點。使用GoToStateAction和適當的觸發器。將您的模板圖形封裝在UserControl中,併爲此UserControl指定狀態。這樣,用戶控件將根據觸發器的行爲(空/不空)而改變。
結果將與我以前的命題相同,但具有狀態更改動畫的附加好處,這很難通過DataTemplateConverter實現(修改的TransitioningContentControl)。
由於綁定到您的轉換器的Count屬性會導致您的轉換器代碼每次添加或從列表中刪除一個項目(每次計數屬性更改時)都會執行,這會對性能產生影響,因此請謹慎操作較長的列表特別是當你認爲你可能將多個控件的可見性綁定到Count == 0時。我個人更喜歡在ViewModel上實現一個屬性來顯式控制我是否處於「空」狀態。 – 1adam12 2011-03-06 23:33:50