我使用Caliburn Micro为Windows Phone 7开发应用程序。
听到应用程序主要部分的代码。
MainView 的一部分:
<Grid x:Name="LayoutRoot" Background="Transparent">
<controls:Panorama>
<controls:PanoramaItem x:Name="SubPanoramaItem"
DataContext="{Binding SubViewModel}">
<StackPanel>
<toolkit:ListPicker ExpansionMode="FullScreenOnly"
ItemsSource="{Binding DataModeList}">
<toolkit:ListPicker.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Tag}" />
</DataTemplate>
</toolkit:ListPicker.ItemTemplate>
<toolkit:ListPicker.FullModeItemTemplate>
<DataTemplate>
<StackPanel x:Name="item"
Margin="5, 24, 0, 24"
cal:Action.TargetWithoutContext="{Binding ElementName=SubPanoramaItem,
Path=DataContext}"
cal:Message.Attach="[Event Tap] = [Action Tap($dataContext)]"
Orientation="Horizontal">
<TextBlock FontSize="40"
Text="{Binding PopupText}" />
</StackPanel>
</DataTemplate>
</toolkit:ListPicker.FullModeItemTemplate>
</toolkit:ListPicker>
</StackPanel>
</controls:PanoramaItem>
<!-- Some other code -->
</controls:Panorama>
</Grid>
MainViewModel :
public class MainViewModel: Screen
{
public SubViewModel SubViewModel { get; private set; }
public MainViewModel(SubViewModel subViewModel)
{
SubViewModel = subViewModel;
}
// some other code
}
SubViewModel :
public class SearchViewModel : Screen
{
private ObservableCollection<DateModeItem> _dataModeList =
new ObservableCollection<DateModeItem>()
{
new DataItem
{ PopupText = "Item 1" },
new DataItem
{ PopupText = "Item 2" },
new DataItem
{ PopupText = "Item 3" },
new DataItem
{ PopupText = "Item 4" }
};
public ObservableCollection<DateModeItem> DataModeList
{
get
{
return _dataModeList;
}
private set { _dataModeList = value; }
}
public void Tap(object dataContext)
{
var item = dataContext as DataItem;
if (item != null)
{
var r = new Random();
switch (item.PopupText)
{
case "Item 1":
item.Tag = r.Next(5);
break;
case "Item 2":
item.Tag = r.Next(5, 10);
break;
case "Item 3":
item.Tag = r.Next(10, 15);
break;
case "Item 4":
item.Tag = r.Next(15, 20);
break;
}
}
}
}
的DataItem :
public class DataItem
{
public string PopupText { get; set; }
public int Tag { get; set; }
}
正如您所看到的,我已将List附加到ListPicker中DataTemplate的每个StackPanel。当在列表中的项目上发生点击时,必须生成新的随机标记。此标记将插入ListPicker的文本框中。
这种行为表现得非常奇怪。当我点击1,2和4项时,根本没有任何事情发生。当我点击3项时,应用程序抛出异常 - “找不到方法点击的目标”。这就是当我使用Silverlight Toolkit中的ListPicker时会发生的事情。
我还从Telerik的RadConrols库中删除了RadListPicker。当我使用它时,调用动作方法是不可预测的。有时动作调用方法正确。有时一切都没发生。我可以肯定地说 - 通过点击最后一项,它可以以正确的方式工作。
发生了什么事?我无法理解。
其他信息:
我已经从我的应用中清除了所有不必要的内容,只留下了我在上一篇文章中描述的代码。
现在,当我使用ListPicker时 - 根本没有任何事情发生。列表没有响应水龙头。有时app会抛出“找不到方法点击的目标”例外。当我使用RadListPicker时 - 几乎总是没有调用动作,有时(很少)正确调用。
答案 0 :(得分:1)
当您使用ListPicker时,您需要按顺序添加一些ElementConventions以将View的Actions绑定到ViewModel。
可以在AppBootstrapper类中添加绑定约定。代码看起来像:
protected override void Configure()
{
ConventionManager.AddElementConvention<ListPicker>(ListPicker.ItemsSourceProperty, "SelectedItem", "SelectionChanged").ApplyBinding =
(viewModelType, path, property, element, convention) => {
if (ConventionManager.GetElementConvention(typeof(ItemsControl)).ApplyBinding(viewModelType, path, property, element, convention))
{
ConventionManager.ConfigureSelectedItem(element, ListPicker.SelectedItemProperty, viewModelType, path);
return true;
}
return false;
}; }