Caliburn.Micro无法绑定到LongListSelector

时间:2015-02-08 23:08:33

标签: windows-phone-8 caliburn.micro

带有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). 

2 个答案:

答案 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.Items‌​SourceProperty, "SelectedItem", "SelectionChanged");

更好的是,如果您正在使用需要后两个属性的任何其他功能。第一个惯例只是使用锅炉板参数。

答案 1 :(得分:1)

这是有道理的,它不是一个bug,因为LongListSelector不在Windows Phone的ConventionManager控件列表中。您必须将其添加为该控件的自定义约定。否则只是正常绑定......