2012-07-06 3 views
1

ViewModel이 연결된 WPF에서 사용자 정의 UserControl을 빌드하고 있습니다. 나는 또한 역동적으로 코드의 컨트롤을 만들고 싶다. 하지만 지금은 ViewModel 속성을 사용하여 생성 된 컨트롤을 바인딩하는 데 문제가 있습니다. 내 코드는 다음과 같습니다WPF ViewModel에 코드 뒤에 동적 컨트롤 바인딩

<UserControl x:Class="SVT.Teste.UserControl1" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300" 
      DataContext="UserControl1ViewModel"> 
    <Grid Name="GridContainer"> 
    </Grid> 
</UserControl> 

뒤에 코드 :

"System.Windows.Data Error: 40 : BindingExpression path error: 'Test' property not found on 'object' ''String' (HashCode=-946585093)'. BindingExpression:Path=Test; DataItem='String' (HashCode=-946585093); target element is 'Button' (Name=''); target property is 'Content' (type 'Object')"

당신이 날 도와 줄 수 :

public UserControl1() 
    { 
     InitializeComponent(); 
     System.Windows.Controls.Button newBtn = new Button(); 
     newBtn.SetBinding(Button.ContentProperty, new Binding("Test")); 
     GridContainer.Children.Add(newBtn); 
    } 

    public class UserControl1ViewModel 
    { 
     private string test = "ola"; 

     public string Test 
     { 
      get { return test; } 
     } 
    } 

내가 받기를 실행하면?

답변

2

를 바인딩하려고합니다.

당신은 같은 것을 할 필요가 : 당신은 유형이 아닌 속성이 인스턴스에 당신의 DataContext를 설정하는

<UserControl xmlns:local="clr-namespace:NAMESPACE_WHERE_VIEWMODEL_IS_DEFINED"> 
    <UserControl.DataContext> 
     <local:UserControl1ViewModel /> 
    </UserControl.DataContext> 
    <!-- unrelated code omitted --> 
</UserControl> 
+0

모든 답변이 작동하지만 이것은 올바른 대답입니다. 첫 번째 방법은보기가 있기 때문에 코드 뒤에 데이터 바인딩을 설정하는 것을 싫어합니다. 고마워요! – Louro

1

이 당신은 문자열 대신 뷰 모델 인스턴스에 UserControl1DataContext 속성을 설정하는

Binding MyBinding = new Binding(); 
MyBinding.Path = new PropertyPath("Test"); 
newBtn.DataContext = new UserControl1ViewModel(); //or MyBinding.Source = new //UserControl1ViewModel(); 


newBtn.SetBinding(Button.ContentProperty, MyBinding); 
2

. 사용자 정의 컨트롤을 만들고 당신의 방법에서 은 수행

  public UserControl1() 
     { 
      InitializeComponent(); 
      System.Windows.Controls.Button newBtn = new Button(); 
      newBtn.SetBinding(Button.ContentProperty, new Binding("Test")); 
      GridContainer.Children.Add(newBtn); 
      **DataContext = new UserControl1ViewModel();** 
     } 

당신은 아직 할 일이 더있다. 알림이나 업데이트가없는 방식이 발생합니다. INotifyPropertyChanged 인터페이스 (UserControlViewModel)를 구현하십시오. 그리고 유형에 XAML에있는 DataContext 설정을 제거하십시오.

0

최대 용량이 맞지만 다른 질문이 있습니다. 바인딩하려는 viemwodel을 가지고있을 때 왜 당신은 당신의 usercontrol을 동적으로 만들고 싶습니까? 나에게 이해가되지 않는다. 설명해 드리겠습니다 :

뷰 모델이있는 경우 -이 뷰 모델을 렌더링하는 방법과 바인딩을 염두에 두어야합니다. 그래서 당신은 그래서 당신이 지금 가지고있는 것은 당신의 ViewModel의 표현이다

<UserControl> 
<Grid> 
    <Button Content="{Binding Test}"/> 
    <!-- more controls and binding if the viewmodel expose more--> 
</Grid> 
</UserControl> 

이 뷰 모델

MyUserControl1View.xaml에 대한 UserControl을 /보기를 만들 수 있습니다. 그들은 연결되어 있지 않지만 viewmodel은 이와 같이 보일 것이고 바인딩이 설정되어 있어야합니다. 지금까지 datacontext는 전혀 설정되지 않았습니다.

이제해야 할 일은 viewmodel의 첫 번째 접근 방식과 datatemplates 사용입니다.

은 우리가

<Window> 
<Window.Resources> 
    <DataTemplate Datatype="{x:Type local:Usercontrol1viewmodel}"> 
    <view:MyUserControl1View/> 
    </DataTemplate> 
</Window.Resources> 

이제 WPF는 Usercontrol1viewmodel을 렌더링하는 방법을 알고 당신의 MainWindow를에 다음을 가정하자.

주 제어보기 모델에서 Usercontrol1view 모델을 한 단계 더 처리하십시오.당신이 ContentPresenter에이 속성을 결합하면

public Usercontrol1viewmodel MyWhatEver {get;set;} 

, 당신은 WPF의 마법을 볼 것이다

<ContentPresenter Content="{Binding MyWhatEver}"/> 

지금 당신은 ContentPresenter에있는 MyUserControl1View 참조), 더 동적보기 코드가 필요하지 않습니다. 당신의 뷰 모델을 가지고 가십시오.

ps : 저의 영어를 자유롭게 편집하십시오.

+0

제 질문에 방금 간단한 예제를 설명했습니다. 문제는 필드 목록이있는 항목 목록이 있다는 것입니다. 이 필드 목록은 동적입니다. 필자는 콤보 상자 나 텍스트 블록을 만들고 ViewModel에 바인딩하기 위해 필드 목록을 반복합니다. 저는이 마지막 부분을 수행하는 방법을 여전히 생각하고 있습니다. 귀하의 관심을 가져 주셔서 감사합니다;) – Louro

+0

np, 필드를 동적으로 작성할 때 - 실제로 객체 (속성이있는 뷰 모델)가 정의시 정의되지 않았습니까? 정의 된 유형이 있으면 오랫동안 내 문제를 해결할 수 있습니다. MVVM (응용 프로그램 루트/mainwindow 제외)을 할 때 나는 "view first"접근법을 정말로 좋아하지 않는다고 말해야 만한다. – blindmeis

+0

문제는 구현 자체보다는 설계 관점에서 나온다. 여기) : http://stackoverflow.com/questions/11358669/wpf-dynamic-controls-in-view-and-viewmodel – Louro