Caliburn Microを使ってWindows Phone 7のアプリを開発しています。
Hear はアプリの主要部分のコードです。
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
}
サブビューモデル:
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;
}
}
}
}
データ項目:
public class DataItem
{
public string PopupText { get; set; }
public int Tag { get; set; }
}
ご覧のとおり、ListPicker の DataTemplate の各 StackPanel に Action をアタッチしました。リスト内の項目をタップすると、新しいランダム タグを生成する必要があります。このタグは、ListPicker のテキスト ボックスに挿入されます。
そして、この行動は非常に奇妙に振る舞います。1、2、4 の項目をタップしても何も起こりません。3 つのアイテムをタップすると、アプリは例外をスローします - 「タップ メソッドのターゲットが見つかりません」。これは、Silverlight Toolkit の ListPicker を使用しているときに起こることです。
また、Telerik の RadConrols ライブラリから RadListPicker を試してみました。私がそれを使用したとき、アクション メソッドの呼び出しは予測できませんでした。アクションが正しいメソッドを呼び出すことがあります。まったく何も起こらないこともあります。確かに言えることの1つは、最後のアイテムをタップすると、正しい方法で機能することが少なくなります。
何が起こっている?理解できません。
追加情報:
アプリからすべての不要なものを削除し、前の投稿で説明したコードのみを残しました。
ListPicker を使用している場合、何も起こりません。リストはタップしても反応しません。アプリが「メソッド Tap のターゲットが見つかりません」という例外をスローすることがあります。RadListPicker を使用している場合、ほとんどの場合、アクションが呼び出されず、(ごくまれに) 正しく呼び出されることもあります。