4

VS2012 で Windows 8 アプリを作成し、2 つの文字列を表示するユーザー コントロールにオブジェクト (カード) のリストをバインドしようとしています。1ページのユーザーコントロールのコードは次のとおりです。

<FlipView x:Name="cardView"/>
   <FlipView.ItemTemplate>
      <DataTemplate>
         <local:TileControl x:Name="cardTile" Width="600" Height="400" QuestionText="{Binding Value.question}" AnswerText="{Binding Value.answer}"/>
      </DataTemplate>
   </FlipView.ItemTemplate>
</FlipView>

これは、C# コード ビハインドで設定されます。

cardView.ItemsSource = Storage.content.Decks[currentDeck].Cards;

ユーザー コントロール 'TileControl' コントロールには、次の変数が含まれています。

public string questionTextStr { get; set; }   
public string answerTextStr { get; set; }

public string QuestionText
{
    get
    {
        return questionTextStr;
    }
    set
    {
        questionTextStr = value;
        questionText.Text = value; //set the textbox content
    }
}

public string AnswerText
{
    get
    {
        return answerTextStr;
    }
    set
    {
        answerTextStr = value;
        answerText.Text = value; //set the textbox content
    }
}

エラー リストに「プロパティ 'Flashdeck.TileControl.AnswerText' への割り当てに失敗しました」というエラーがあります。また、QuestionText にも適用されます。アプリはコンパイルおよび実行されますが、ユーザー コントロールを含むページを開くとクラッシュします。エラーとクラッシュを引き起こすために何が間違っていますか? ありがとう。

編集: デッキとカード クラスの詳細。デッキ:

public class Deck
    {
        public List<Card> Cards { get; set; }
        public bool flagged { get; set; }

        public Deck()
        {
        }

        public Deck(List<Card> iCards)
        {
            Cards = iCards;
            flagged = false;
        }

        public Deck(List<Card> iCards, bool iFlag)
        {
            Cards = iCards;
            flagged = iFlag;
        }
    }

カード:

public class Card
    {
        public string question { get; set; }
        public string answer { get; set; }
        public bool flagged { get; set; }

        public Card()
        {
        }

        public Card(string iQ, string iA)
        {
            question = iQ;
            answer = iA;
            flagged = false;
        }
    }
4

2 に答える 2

6

値をバインドするには、プロパティを DependencyProperties にする必要があります。

public string QuestionText
{
    get
    {
        return (string)GetValue(QuestionTextProperty);
    }
    set
    {
        SetValue(QuestionTextProperty, value);
        questionText.Text = value; //set the textbox content
    }
}
public static DependencyProperty QuestionTextProperty = DependencyProperty.Register("QuestionText", typeof(string), typeof(Deck), new PropertyMetadata(""));

...

このために、クラス Deck は DependencyObject から継承する必要があります。

編集: Card-Class には Value と呼ばれるプロパティはありません。そのため、Value.question へのバインドが機能しません。代わりに試してください

<FlipView x:Name="cardView"/>
   <FlipView.ItemTemplate>
      <DataTemplate>
         <local:TileControl x:Name="cardTile" Width="600" Height="400" QuestionText="{Binding Path=question}" AnswerText="{Binding Path=answer}"/>
      </DataTemplate>
   </FlipView.ItemTemplate>
</FlipView>

ここで説明されているように、質問/回答プロパティのセッターで PropertyChanged イベントを呼び出して、プロパティの値が変更されたときにバインディングを更新します。

于 2012-10-15T09:21:17.360 に答える
0

Decksクラスにquestionanswer属性がある場合は、それらの評価者を作成し、 と を割り当てるだけですQuestionText="{Binding Question}"AnswerText="{Binding Answer}"

Decksクラスで

public string Question 
{
    get;
    set;
}

public string Answer
{
    get;
    set;
}
于 2012-10-15T03:51:54.143 に答える