带有Caliburn.Micro 2.0.1的Windows phone 8无法绑定到LongListSelector。对于Caliburn尝试将项目绑定到Visibility属性。 这是XAML
<phone:LongListSelector
x:Name="Items"
ItemTemplate="{StaticResource MyItemTemplate}">
</phone:LongListSelector>
并且查看模型属性非常基本:
IObservableCollection<Item> _Items;
public IObservableCollection<Item> Items
{
get { return _Items; }
set
{
_Items = value;
NotifyOfPropertyChange(() => Items);
}
}
public class Item : PropertyChangedBase
{
string _Name;
public string Name
{
get { return _Name; }
set { _Name = value; NotifyOfPropertyChange(() => Name); }
}
}
这是调试输出
System.Windows.Data Error: 'MS.Internal.Data.DynamicValueConverter' converter failed to convert value 'Caliburn.Micro.BindableCollection`1[Checklists.ViewModels.ItemsPageViewModel+Item]' (type 'Caliburn.Micro.BindableCollection`1[CLS.ViewModels.ItemsPageViewModel+Item]'); BindingExpression: Path='Items' DataItem='CLS.ViewModels.ItemsPageViewModel' (HashCode=38524289); target element is 'Microsoft.Phone.Controls.LongListSelector' (Name='Items'); target property is 'Visibility' (type 'System.Windows.Visibility').. System.InvalidOperationException: Can't convert type Caliburn.Micro.BindableCollection`1[CLS.ViewModels.ItemsPageViewModel+Item] to type System.Windows.Visibility.
at MS.Internal.Data.DefaultValueConverter.Create(Type sourceType, Type targetType, Boolean targetToSource)
at MS.Internal.Data.DynamicValueConverter.EnsureConverter(Type sourceType, Type targetType)
at MS.Internal.Data.DynamicValueConverter.Convert(Object value, Type targetType, Object parameter, CultureInfo culture)
at System.Windows.Data.BindingExpression.ConvertToTarget(Object value).
答案 0 :(得分:2)
您尝试使用此处的约定是Caliburn.Micro已为ItemsControl
设置的约定,但不幸的是LongListSelector未继承自ItemsControl
1}}。奇怪的是它没有,所以你假设一切都会起作用。
可以使用以下
添加LongListSelector
的基本约定
ConventionManager.AddElementConvention<LongListSelector>(LongListSelector.ItemsSourceProperty, "DataContext", "Loaded");
将在Bootstrapper
中调用。请注意,此约定不会设置ItemTemplate
的默认ItemsSource
。
修改强>
第一个属性用于属性绑定约定,如果您有一个匹配x:Name
的属性,那么这是绑定的属性。
第二个是参数属性,如果您将元素作为cm:Message.Attach="DoStuff(Items)"
之类的消息中的参数引用,则使用什么属性。
第三个是如果附加了动作则触发动作的事件。
评论中提到的那个
ConventionManager.AddElementConvention<LongListSelector>(LongListSelector.ItemsSourceProperty, "SelectedItem", "SelectionChanged");
更好的是,如果您正在使用需要后两个属性的任何其他功能。第一个惯例只是使用锅炉板参数。
答案 1 :(得分:1)
这是有道理的,它不是一个bug,因为LongListSelector不在Windows Phone的ConventionManager控件列表中。您必须将其添加为该控件的自定义约定。否则只是正常绑定......