0

DataContextフィールドをボタンのDataTemplate(contlisttemplate)に移動しない限り、ICommandはトリガーされません。スタイルリソースに画像を設定しましたが、DataContextフィールドをDataTemplateに移動するとすぐに画像が消えます。画像とICommandの両方が同じDataContextを使用している必要があるため、なぜ機能しないのかわかりません。

これが私のコードの抜粋です。

DataContext="{Binding LongListViewModel, Source={StaticResource viewModelLocator}}"

<i:Interaction.Behaviors>
    <GamePad:XboxBehavior StartFocusControlName="continuousList1" IsTopLevelViewForFocus="True"/>
</i:Interaction.Behaviors>

<UserControl.Resources>
    <DataTemplate x:Key="contlisttemplate" >
        <Button  
            Command="{Binding Gotodetailpage}"
            Style="{StaticResource custherotile}">
        </Button> 
    </DataTemplate>
</UserControl.Resources>

<Grid x:Name="LayoutRoot">
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition/>
    </Grid.RowDefinitions>

    <xbox:ContinuousList 
        HorizontalAlignment="Left" 
        Name="continuousList1" 
        VerticalAlignment="Top"                      
        ItemTemplate="{StaticResource contlisttemplate}"
        ItemsSource="{Binding LongListItems}" Height="316" Width="1280"
        Grid.Row="1"
        >

        <i:Interaction.Behaviors>
            <GamePad:XboxBehavior IsContinuousListVuiEnabled="True" HasFocusRetention="True"/>
        </i:Interaction.Behaviors>

    </xbox:ContinuousList>

public class LongListViewModel : ViewModelBase<LongListViewModel>
{
    private readonly IDialogService dialogService;
    public Navigateto compass = new Navigateto();

    public LongListViewModel()
    {
        LongListItems = new ObservableCollection<object>();
        dictionaryListwithkey = new Dictionary<string, object>();
        Gotodetailpage = new RelayCommand(PerformGotoDetailPage);
    }

    public LongListViewModel(IDialogService dialogService)
        : this()
    {
        this.dialogService = dialogService;
    }


    public Program getherovideo
    {
        get { return (Program)LongListItems[0]; }
        set
        {
            //SetProperty(ref currentVideo, value,x => x.CurrentVideo);
        }
    }

    public ObservableCollection<object> LongListItems
    {
        get;
        set;
    }


    public Dictionary<string, object> dictionaryListwithkey
    {
        get;
        set;
    }

    public ICommand Gotodetailpage { get; private set; }

    private void PerformGotoDetailPage()
    {
       // Console.WriteLine("List item clicked");
        compass.goToDetailsPageWithPath("89");
    }
}
4

1 に答える 1

0

誰かが答えが何であるか疑問に思っていた場合に備えて。アーロンヒルATGによると:

これはスコープの問題のように見えます。外側のDataContextは、目的のICommandを含むLongListViewModelクラスですが、コンテナーのItemsSourceは、ビューモデルによって公開されるLongListItemsコレクションに設定されます。これは、DataTemplateの有効なDataContextが、ビューモデル全体ではなく、コレクションの個々のメンバーであることを意味します。

DataTemplateのDataContextをオーバーライドすると、ビューモデルをポイントしてICommandにアクセスできますが、LongListItemsコレクションの個々の要素内に存在するデータが失われることも意味します。この場合、画像が機能しなくなったのはおそらくそのためです。

コレクション内の各アイテムには独自のボタンがあるため、ビューモデルではなく個々のアイテムにICommandプロパティを公開することはおそらく理にかなっています。

于 2012-07-10T16:25:56.927 に答える