2011-06-13 9 views
3

저는 WPF를 처음 사용하고 있으며 데이터 바인딩이 작동하는 방식을 이해하려고 노력하고 있지만 많은 행운이 없습니다.WPF 데이터 바인딩에 대한 도움말

저는 간단한 작업부터 시작하려고합니다. 텍스트 상자의 내용을 내 프로그램의 문자열 변수에 바인딩하려고합니다.

데이터 바인딩, XML 네임 스페이스, 마크 업 확장, 리소스, 종속성 속성 및 기타 등등에 대한 MSDN 설명서 페이지를 많이 읽었으며 여전히 작동하지 못합니다.

<Window x:Class="WpfTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:c="clr-namespace:WpfTest" 
     Title="MainWindow"> 
    <Grid> 
     <Grid.Resources> 
      <c:Foo x:Key="MyFoo"/> 
     </Grid.Resources> 
     <TextBox Width="100" Height="28" 
       Text="{Binding Source=MyFoo, 
           Path=BarProperty, 
           Mode=TwoWay, 
           UpdateSourceTrigger=PropertyChanged}"/> 
    </Grid> 
</Window> 

그리고 내 MainWindow.xaml.cs를 : 여기에

내 MainWindow.xaml의,

namespace WpfTest 
{ 
    public class Foo : DependencyObject 
    { 
     public static readonly DependencyProperty BarProperty = DependencyProperty.Register("Bar", typeof(String), typeof(Foo)); 

     public String Bar 
     { 
      get { return (String)GetValue(BarProperty); } 
      set { SetValue(BarProperty, value); } 
     } 
    } 

    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      MyFoo = new Foo { Bar = "hello" }; 
     } 

     public Foo MyFoo { get; set; } 
    } 
} 

내가 텍스트 상자가 "안녕하세요"프로그램이 시작될 때 보여 기대하지만, 그것은 비어 있습니다.

누군가 내가 뭘 잘못하고 있다고 말할 수 있습니까?

+0

당신이 읽은 경우 [데이터 바인딩 개요를 (http://msdn.microsoft.com/en-us/library/ms752347.aspx)을 아마 모든 것을 스스로 알아볼 수 있었을 것입니다 ..... –

+0

@HB 데이터 바인딩 개요와 수많은 다른 MSDN 설명서 페이지를 읽었습니다. 사실 나는 "Creating a Binding"아래에있는 예제를 기반으로 코드를 작성했지만 작동하지 않았습니다! 그들의 모든 예제는이'Grid.Resources' 나'DockPanel.Resources' 섹션을 사용했습니다. – HighCommander4

+0

글쎄, 그것은 'StaticResourceExtension'이나 클래스 이름없이 리소스의 키를 입력하는 일반적인 실수입니다. 두 경우 모두'Source'를 문자열로 만듭니다. 그런데 XAML에서 소스를 올바르게 만들 수는 있지만 바인딩 마크 업 확장을 사용할 수는 없지만 XML 요소 구문으로 소스를 지정할 수있는 실제 Binding 객체를 사용할 수는 있습니다. –

답변

1

를 당신은 소스를 지정해야 하나를 :..

이름 = "mywin", 변경하여 바인딩 witn의 경우 ElementName = "myWin"

같은 창에 이름을 지정

또는 창을 설정하십시오. DataContext li "Binding ElementName ="myWin "- 이름을 원하지 않는다면 RelativeSource를 사용할 수도 있습니다 - 테스트하지 않은 채 게시 할 수는 없습니다 - 바인딩은 사용자가주의 깊게 테스트해야하는 경향이 있습니다. :)

이 도움이 될 수 있습니다 :

http://blogs.msdn.com/b/wpfsdk/archive/2006/10/19/wpf-basic-data-binding-faq.aspx

+0

그거 고마워! – HighCommander4

3

Window의 DataContext을 자체로 설정해야합니다.

public MainWindow() 
{ 
    InitializeComponent(); 
    this.DataContext = this; 
    MyFoo = new Foo { Bar = "hello" }; 
} 

이렇게하면 WPF에서 클래스 내의 바인딩을 찾습니다.

모든 컨트롤은 내부, 내가 바인딩 할 때 당신은 그 자체로 MainWindowDataContext을 설정, 그래서 만약 내가이 특정 인스턴스 ...이 상속에 속성에 바인딩 할 "라고하는 모든 컨트롤을 DataContext을 설정할 수 있습니다 MainWindowMainWindow의 속성에 바인딩

+0

도움이되지 않습니다 ... 텍스트 상자가 여전히 비어 있습니다. – HighCommander4

+0

업데이트 : 바인딩을 ** Source ** 속성에서 제거하고 ** Path를 MyFoo.Bar로 변경하면 작동합니다. – HighCommander4

+0

@ HighCommander4 : 소스를 제거해야한다는 점에 유의할 것입니다 (사용할 수있는 다른 소스는 'RelativeSource'와 'ElementName'이며, 지정된 경우 DataContext 대신 사용됩니다). –

관련 문제