2014-05-14 2 views
0

WPF를 처음 사용하고 데이터 바인딩을 사용하여 내 컨트롤을 내 코드의 개체에 바인딩하는 방법을 이해하려고합니다. 코드 숨김에서 XAML 개체에 액세스하는 방법에 대한 몇 가지 질문을 볼 수 있지만 그게 내가 원하는 것은 아닙니다. 나는 그 일을하는 법을 이미 알고있다.XAML 코드에서 개체 액세스

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

XAML에서 코드 숨김에있는 클래스에 액세스하는 방법에 대한 답변도 보았습니다.

하지만 클래스의 특정 인스턴스에 적용하는 방법을 알지 못합니다. 다음은 내가하려는 일의 예입니다. '바인딩'은 분명히 잘못되었습니다. 그것이 내가 도움이 필요한 것입니다.

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> 

제가 읽은 책과 튜토리얼은 매우 간단해야합니다. 내가 뭘 놓치고 있니?

+1

질문을 다시 말하면, 정확히 무엇이 누락되었는지 말할 수 없습니다. –

답변

1

시도하는 방식대로 클래스에 직접 DataBind를 할 수 있지만 일반적으로 수행되는 방식은 아닙니다. 권장되는 접근 방식은 UI에 표시 할 모든 모델 데이터를 집계 한 다음 해당 ViewModel을 View (이 경우 Window)의 DataContext로 설정하는 객체 (ViewModel)를 만드는 것입니다. 대부분의 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> 
0

귀하의 문제는 그리드의 DataContext를 말하는 것입니다 = MainWindow, 당신은 그렇게하지 않아도됩니다. (datacontext는 그들이 제공하는 경우를 제외하고 아이들에 의해 상속됩니다. e 자신의 재정의) 그리고 당신이 잘못하고있다 (당신은 STRING MainWindow에 컨텍스트를 설정하고 STRING에는 "ListItems"또는 "LabelText"속성이 없다.

당신이 당신의 MainWindow를의 생성자에서 다음 데이터 컨텍스트로 현재 클래스를 사용하려면 단지

this.DataContext을 =이;

그리고 XAML에서 그리드에 배치 한 datacontext를 제거하십시오.

+0

XAML에서 DataContext를 "self"로 설정하는 방법은 다음과 같습니다. http://stackoverflow.com/a/5077461/357625 – avanek

관련 문제