2010-06-22 4 views
0

내 데이터 모델에 DI를 사용할 수 있도록 외부 클래스에서 내 윈도우의 DataContext를 정의하고 싶습니다. 자습서를 읽었지만 함께 사용할 수는 없습니다. 내가 XAML 코드로 데이터 오브젝트를 실체화 할 때컨트롤러 코드에서 DataContext 정의

class Data 
{ 
    public String Value { get; set; } 

    public Data() 
    { 
     Value = "Test"; 
    } 
} 

는, 데이터 바인딩이 제대로 작동 : 우리는 간단한 데이터 모델을 말해봐

<Window ...> 
    <Window.Resources> 
    <src:Data x:Key="data" /> 
    </Window.Resources> 
    <Window.DataContext> 
    <Binding Source="{StaticResource ResourceKey=data}" /> 
    </Window.DataContext> 
    <Grid> 
    <Label Content="{Binding Path=Value}" /> 
    </Grid> 
</Window> 

을하지만 외부에서 데이터를 결합하려고하면 클래스, 창은 아무것도 표시되지 않습니다 나는 오류 얻을 :

<Window ...> 
    <Grid> 
    <Label Content="{Binding Path=Value}" /> 
    </Grid> 
</Window> 

그리고 메인 클래스 :

나는 뭔가를 놓친가요? 어쩌면 DataContext 속성을 다른 스레드에서 설정해야합니까?

class Test 
{ 
    [@STAThreadAttribute()] 
    public static void Main(string[] args) 
    { 
     MainWindow w = new MainWindow(); 

     w.DataContext = new Data(); 

     w.ShowDialog(); 
    } 
} 

을 또는 바인딩을 사용하고 뒤에 코드에서 다르게 바인딩을 설정해야합니다 :

답변

1

당신은 뒤에 코드에서 데이터를 직접 설정할 수 있습니다 예에서

class Test 
{ 
    [@STAThreadAttribute()] 
    public static void Main(string[] args) 
    { 
     MainWindow w = new MainWindow(); 

     Binding b = new Binding(); 
     b.Source = new Data(); 
     SetBinding(DataContextProperty, b); 

     w.ShowDialog(); 
    } 
} 

을 사용자가 설정 Binding as DataContext는 데이터가 아니라 Binding 객체 자체에 바인딩된다는 것을 의미합니다. Xaml을 사용하는 경우 바인딩을 사용할지 여부를 직접 결정하고 첫 번째 바인딩 대신 후자를 사용합니다!

희망이 도움이됩니다.

+0

예! 작동했습니다. 그래서 올바르게 이해한다면,'DataContext = someObject' 문법을 사용할 때, DataContext 속성은 자동적으로 someObject에 대한 Binding 객체를 instanciates합니까? – slaphappy

+1

아니요. 개체를 직접 설정하기 만하면됩니다. 바인딩을 사용하고 속성에 대한 경로를 사용하면 변경 사항이 등록됩니다. 객체에 대한 바인딩이 아닌 객체에 대한 바인딩을 사용하면 꽤 쓸모가 없습니다. 객체는 절대로 변경되지 않으므로 변경 사항을 등록 할 필요가 없으므로 직접 객체에 대한 바인딩이 필요하지 않습니다! – Arcturus

관련 문제