2017-01-31 9 views
1

ListBoxを持つUWP C#アプリケーションがあります。 ListBox ItemContainerStyleプロパティをリソース内のスタイルに設定します。スタイル内でControlTemplateにボタンを追加しようとしています。 Clickedまたはtappedイベントハンドラをどこに追加するかはわかりません。UWP XAMLのlistboxitemに機能ボタンを追加するには

私は、リストに直接追加されたUserControlを使用するようにコードを変換しました。それは、VisualStateManagerがUserControlでは機能しないことを除いて、うまく動作します。

私はUserControlのコードビハインドで機能するボタンを得ることができ、VisualStateManagerを使用してListBoxItem選択項目のカスタムビジュアライゼーションを処理することができますが、ビジュアル状態と機能ボタンは取得できません。

私が言ったように、ボタン以外のものはすべてスタイルでうまく動作し、すべてがビジュアルステート処理以外のユーザーコントロールでうまく動作するため、ここに表示するコードはわかりません。

これについて私が知ることができるすべての質問を読んだところ、私ができるのはボタンのハンドラ機能を持つことですが、誰もそれをどのクラスに追加するのかは誰にも分かりません。彼らは機能を単独では何の文脈でも示していない。視覚的な状態の処理は、常に、マウスのオーバー、セレクションなどを検出する必要があるようです。各状態を検出するためのハンドラと、次にGoToStateを呼び出してビジュアルステートマネージャを取得するコードで処理される状態そのこと。これらの揺れや余分なコードや一見冗長なコードがなければ、これを行う方法が必要になります。

[更新]

私は現在、ItemContainerStyleを設定することにより、ListBoxItemのスタイルを使用しています。また、私は、新しく追加されたButtonのCommandパラメーターをバインドしようとしています。それは動作しません。スタイルのXAMLは、重要な部分だけを表示します(ボタン以外はすべて期待どおりに機能するため)。 2つのテキストボックスとボタンが表示されます。 TextBox要素のTextプロパティのバインディングが正常に動作し、テキストが期待どおり正確に表示されることに注意することが重要です。これは、バインディング元とパスのものがすべて正しく設定されていると仮定したいと思うようになります。

:ここ

<StackPanel Background="Transparent" Margin="0,0,0,0"> 
    <TextBlock FontSize="22" TextWrapping="Wrap" FontWeight="SemiLight" x:Name="Title" Text="{Binding Title}" Margin="12,4,24,6" Visibility="{Binding Title, Converter={StaticResource StringToVisibiltyConverter}}" Foreground="{Binding color}"/> 
    <TextBlock TextWrapping="Wrap" Visibility="{Binding SubTitle, Converter={StaticResource StringToVisibiltyConverter}}" x:Name="Subtitle" Text="{Binding SubTitle}" Margin="12,-6,24,6" Opacity="0.8" Foreground="{Binding color}"/> 
    <Button Command="{Binding ClickCommand}" CommandParameter="x">X</Button> 
</StackPanel> 

は、私は、リストボックスに追加したオブジェクトのためのコードです:コマンドが動作していないバインディングとエラーがビルド時または実行時に報告されていないので、しかし、再び、私くじか

public class MultilineListboxItem : Object 
{ 
    public MultilineListboxItem() { ClickCommand = new _ClickCommand(); } 

    public string Title { get; set; } 
    public string SubTitle { get; set; } 
    public string Original { get; set; } 
    public override string ToString() { return Original; } 
    public SolidColorBrush color { get; set; } 

    _ClickCommand ClickCommand; 
} 

そしてもちろん、_ClickCommandクラス定義:

public class _ClickCommand : ICommand 
{ 
    public void Execute(object parameter) 
    { 
     Diagnostics.AppendDiagnostic("derf"); 
    } 


    public bool CanExecute(object parameter) 
    { 
     Diagnostics.AppendDiagnostic("derf"); 
     return true; 
    } 

    public event EventHandler CanExecuteChanged; 
} 

者は、C#やWinRTの中で何か自分の診断レポート機能ではありません。

スタイルを使用してリスト項目の外観を定義したので、ビジュアル状態はすべて期待通りに機能しています。

答えて

3

ClickCommandをパブリックプロパティに変更してください。

  • あなたはバインディングのソースプロパティをバインディングとして使用するプロパティは、クラスのパブリックプロパティでなければなりません。明示的に定義されたインターフェイス プロパティはバインディング目的ではアクセスできません。 ベースのないプライベート、内部、または仮想プロパティ を保護することはできません。
  • パブリックフィールドにバインドすることはできません。

参照:Bind`、 `private`はあまりにも動作します:

+0

はちょうどあなたが' Xを使用している場合ことを指摘したいと思います。 –

関連する問題