1

C# コードを使用した WP7 でのデータ バインディングについて質問があります。

カスタムクラスがあれば、すべてが明確です。Source プロパティをクラス インスタンスに設定し、Path プロパティをそのクラス内のプロパティに設定しています。このように(そして動作します)

Binding binding = new Binding()
{
  Source = myclass,
  Path = new PropertyPath("myproperty"),
  Mode = BindingMode.TwoWay
};
myButton.SetBinding(dp, binding);

では、Boolean 変数や List<> の単一項目などの単純な構造をバインドするにはどうすればよいでしょうか? Path プロパティに何を書き込むか、または何を書き込む必要がありますかSource = myBoolean? Source = List[5](TwoWay バインディングが必要なので、Path プロパティの設定は必須であることに注意してください)

最終的解決:

変数をバインドするには、この変数がパブリック プロパティであり、INotifyPropertyChanged が実装されている必要があります。この目的のために、List を ObservableCollection に置き換えることができます。

残りはすべて nmaait の回答のようになり、コード全体は次のようになります。

public partial class Main : PhoneApplicationPage, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private Boolean _myBoolean { get; set; }
    public Boolean myBoolean
    {
        get { return _myBoolean; }
        set { _myBoolean = value; OnPropertyChanged("myBoolean"); }
    }
    ObservableCollection<Int32> myList { get; set; }

    public Main()
    {
        InitializeComponent();

        this.Loaded += new RoutedEventHandler(Main_Loaded);
    }

    protected void OnPropertyChanged(String name)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
    }

    void Main_Loaded(object sender, RoutedEventArgs e)
    {
        myBoolean = false;
        myList = new ObservableCollection<int>() { 100, 150, 200, 250 };


        Binding binding1 = new Binding()
        {
            Source = this,
            Path = new PropertyPath("myBoolean"),
            Mode = BindingMode.TwoWay
        };
        myButton.SetBinding(Button.IsEnabledProperty, binding1);


        Binding binding2 = new Binding()
        {
            Source = myList,
            Path = new PropertyPath("[1]"),
            Mode = BindingMode.TwoWay
        };

        myButton.SetBinding(Button.WidthProperty, binding2);
    }

    private void changeButton_Click(object sender, RoutedEventArgs e)
    {
        myList[1] +=50;
        myBoolean = !myBoolean;
    }
}
4

1 に答える 1

1

ソースはデータ コンテキストであるため、実際にはソースをブール値自体として設定するのではなく、既に行ったようにブール値が属するクラス/要素としてソースを設定します。パスは myBoolean または List[5] になります。

ブール値が現在のクラスにある場合は、次のことができます

Binding binding = new Binding()
{
  Source = this,
  Path = new PropertyPath("myBoolean"),
  Mode = BindingMode.TwoWay
};
myButton.SetBinding(dp, binding);

リスト項目にバインドすることで、正確に何を達成しようとしていますか。リストが変更された場合、特定のインデックスにバインドしたくない場合は、このように選択したアイテムにバインドできます。特定のリスト項目にバインドすることで達成する必要があることについて、さらに詳しい情報を提供してください。

Binding binding = new Binding()
{
  Source = List,
  Path = new PropertyPath("SelectedItem"),
  Mode = BindingMode.TwoWay
};
myButton.SetBinding(dp, binding);
于 2012-08-20T02:36:38.080 に答える