2011-01-09 2 views
3

정수 목록에 바인딩되는 Windows Phone 7 ListBox이 있습니다. 기본 MVVM Light 템플릿을 사용하므로 데이터가 포함 된 ViewModel 클래스와 간단한 RelayCommand 클래스가 있습니다. 목록 상자는 다음과 같습니다.WP7 : ListBox.ItemsPanel이 내 ElementName 데이터 바인딩을 손상시키는 이유는 무엇입니까?

<ListBox ItemsSource="{Binding MyData}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate>       
      <Button Content="{Binding}"> 
       <i:Interaction.Triggers> 
        <i:EventTrigger EventName="Click"> 
         <cmd:EventToCommand Command="{Binding ElementName=ContentGrid, Path=DataContext.TestCommand}" 
              CommandParameter="{Binding}" /> 
        </i:EventTrigger> 
       </i:Interaction.Triggers> 
      </Button> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

이렇게하면 단추 안에 정수의 세로 목록이 표시됩니다. 이들 중 하나를 클릭하면 다음 명령 코드가 실행되어 팝업을 표시합니다. new RelayCommand<int>(i => MessageBox.Show("Test" + i));

그러나 XAML을 추가하여 가로 목록을 변경하면 데이터 바인딩이 실패합니다. 단추를 클릭해도 오류 메시지가 출력 창에 기록되지 않습니다.

<ListBox.ItemsPanel> 
    <ItemsPanelTemplate> 
     <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" /> 
    </ItemsPanelTemplate> 
</ListBox.ItemsPanel> 

나는 EventToCommand 바인딩의 다른 유형을 시도했다. 예를 들어, 내 ViewModel을 정적 자원으로 지정하십시오. 그것은 작동하지만 위의 예제보다 덜 이상적입니다.

ItemsPanel이 데이터 바인딩을 중단합니까?

+0

누군가가 여기에이 문제를 언급 : http://forums.silverlight.net/forums/p/ 213237/503547.aspx 문제는 MVVM Light를 포함하지 않으며 WP7에만 해당됩니다. – user10789

답변

2

이 문제는 Silverlight 3의 알려진 문제입니다.

<UserControl x:Class="SilverlightApplication.MyUserControl"> 
     <Button Content="{Binding}"> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="Click"> 
        <cmd:EventToCommand Command="{Binding ElementName=ContentGrid, Path=DataContext.TestCommand}" 
             CommandParameter="{Binding}" /> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
     </Button> 
    </UserControl> 

를 대신 사용 :이 문제를 해결하려면, 당신은 DataTemplateUserControl A의 포장

<ListBox ItemsSource="{Binding MyData}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate>       
      <local:MyUserControl /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+3

MVVM Light에서 ViewModelLocator를 통해 VM을 찾을 수도 있습니다. 나는 그것을 개인적으로 선호한다. 바인딩은 {Binding Source = {StaticResource Locator}, Path = Main.MyCommand}가됩니다. 여기서 Main은 MyCommand를 호스트하는 VM입니다. – LBugnion

+0

@LBugnion : 그 사실을 몰랐습니다. 팁 고마워. 저는 프리즘에 익숙하지만 MVVM 라이트에는 익숙하지 않습니다. 절대 초보자에게 좋은 시작일 것입니다/referecne/documentation을 가르쳐 주시겠습니까? 예를 들어, 프리즘에는 큰 PDF가 있습니다. – decyclone

관련 문제