2

私は WPF を初めて使用し、データ バインディングを使用してウィンドウのコントロールをコード ビハインドのオブジェクトにバインドする方法を理解しようとしています。コード ビハインドから XAML オブジェクトにアクセスすることについていくつか質問がありますが、それは私が探しているものではありません。私はすでにそれを行う方法を知っています。

label1.Content = LabelText;
listbox1.ItemsSource = ListItems;

XAML からコード ビハインドでクラスにアクセスする方法についての回答も見ました。

<local:MyClass x:Key="myClass" />

しかし、それをクラスの特定のインスタンスに適用する方法がわかりません。これが私がやろうとしていることの例です。「バインディング」は明らかに間違っています。それが私が助けを必要としているものです。

public partial class MainWindow : Window
{
    private string _labelText;
    private List<string> _listItems = new List<string>();

    public MainWindow()
    {
        InitializeComponent();

        _labelText = "Binding";
        _listItems.Add("To");
        _listItems.Add("An");
        _listItems.Add("Object");
    }

    public string LabelText
    {
        get { return _labelText; }
        set { _labelText = value; }
    }

    public List<string> ListItems
    {
        get { return _listItems; }
        set { _listItems = value; }
    }
}

<Window x:Class="SO_Demo.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="SO Demo" Height="160" Width="225">
  <Grid DataContext="MainWindow">
    <Label x:Name="label1" Width="80" Height="25" Margin="12,12,0,0" 
           Content="{Binding Path=LabelText}"
           HorizontalAlignment="Left" VerticalAlignment="Top" />
    <ListBox x:Name="listbox1" Width="100" Height="60" Margin="12,44,0,0" 
             ItemsSource="{Binding Path=ListItems}" DisplayMemberPath="ListItems"
             HorizontalAlignment="Left" VerticalAlignment="Top" />
  </Grid>
</Window>

私が読んだ本やチュートリアルでは、これは非常に単純であるように思えます。私は何が欠けていますか?

4

2 に答える 2

4

DataBind試みている方法でクラスに直接アクセスできますが、これは一般的に行われている方法ではありません。推奨されるアプローチは、UI に表示するすべてのモデル データを集約するオブジェクト (ViewModel) を作成し、その ViewModel をDataContextビュー (この場合は Window) として設定することです。ほとんどの WPF アプリケーションの構築方法である MVVM について読むことをお勧めします。しかし、以下の例から始めることができます。

上記のサンプルに基づく簡単な例を次に示します。

ビューモデル

public class MyViewModel : INotifyPropertyChanged
{
    private string _title;
    private ObservableCollection<string> _items;

    public string LabelText
    { 
        get { return _title; } 
        set 
        { 
            _title = value;
            this.RaisePropertyChanged("Title");
        }
    }

    public ObservableCollection<string> ListItems { 
        get { return _items; }
        set 
        { 
            _items = value;   //Not the best way to populate your "items", but this is just for demonstration purposes.
            this.RaisePropertyChanged("ListItems");
        }
    }

    //Implementation of INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

}

コードビハインド

public partial class MainWindow : Window
{
    private MyViewModel _viewModel;

    public MainWindow()
    {
        InitializeComponent();
        _viewModel = new MyViewModel();

        //Initialize view model with data...

        this.DataContext = _viewModel;
    }
}

ビュー (ウィンドウ)

<Window x:Class="SO_Demo.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="SO Demo" Height="160" Width="225">
  <Grid>
    <Label x:Name="label1" Width="80" Height="25" Margin="12,12,0,0"               Content="{Binding Path=LabelText}"
           HorizontalAlignment="Left" VerticalAlignment="Top" />
    <ListBox x:Name="listbox1" Width="100" Height="60" Margin="12,44,0,0" 
             ItemsSource="{Binding Path=ListItems}"
             HorizontalAlignment="Left" VerticalAlignment="Top" />
  </Grid>
</Window>
于 2013-03-04T22:13:12.837 に答える
3

<Grid DataContext="MainWindow">無効です。

ウィンドウを参照する場合は、次のいずれかを行う必要があります。

<Window x:Name="MyWindow">
   <Grid DataContext="{Binding ElementName=MyWindow}"/>
</Window>

また

<Grid DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"/>
于 2013-03-04T21:55:37.023 に答える