2009-03-26 3 views
12

Silverlight DataTemplate에서 이벤트를 바인딩 할 수 있습니까? 그렇다면 최선의 방법은 무엇입니까? 그런 다음Silverlight DataTemplate에서 이벤트를 바인딩 할 수 있습니까?

<UserControl.Resources> 
    <DataTemplate x:Key="MyDataTemplate" > 
    <Grid> 
     <Button Content="{Binding ButtonText}" Margin="4" /> 
    </Grid> 
    </DataTemplate> 
</UserControl.Resources> 

, 당신은 다음과 같이 목록 상자 ItemTemplate을에 적용 : 예를 들어

, 당신은 이런 식으로 버튼이있는 DataTemplate을을 만든 말

<Grid x:Name="LayoutRoot" Background="White"> 
    <ListBox x:Name="lbListBox" ItemTemplate="{StaticResource MyDataTemplate}" />  
</Grid> 

당신은 클래스의 객체의 목록에 목록 상자의 ItemSource을 설정 한 경우 :

public class MyDataClass 
{ 
    public string ButtonText{ get; set; } 
} 

어떻게 당신이 일 붙잡는 e 단추 목록의 DataTemplate에서 각 단추를 클릭? 바인딩을 사용하여 Click 이벤트를 "MyButtonClass"의 메서드에 바인딩 할 수 있습니까?

<UserControl.Resources> 
    <DataTemplate x:Key="MyDataTemplate" > 
    <Grid> 
     <Button Click="{Binding OnItemButtonClick}" Content="{Binding ButtonText}" Margin="4" /> 
    </Grid> 
    </DataTemplate> 
</UserControl.Resources> 

이 방법이 가능합니까? 그렇다면 이벤트를 잡으려면 "MyDataClass"에 무엇을 넣어야합니까?

덕분에, 제프

+0

이것은 명령이 더 나은 이유입니다. .NET 4 프레임 워크에서는 이벤트와 달리 명령을 바인딩 할 수 있으므로 코드 비하인드 및 바인딩 기능이없는 MVVM을 계속 사용할 수 있습니다. –

답변

4

은 몇 가지 옵션이 있습니다.

하나. 해당 행에 대한 데이터 개체에 바인딩 된 사용자 지정 컨트롤을 만듭니다. 해당 사용자 지정 컨트롤에서 바인딩 된 개체에 대한 처리기를 추가하십시오.

클릭에 대한 바인딩이 제대로 작동하지 않을 것이라고 생각합니다. Binding Statement를 무시하고 단순히 클릭만으로 문자열을 선언하십시오.

컨트롤이 들어있는 페이지에 핸들러를 추가하십시오. 이 방법으로 바인딩하면 해당 항목의 보낸 사람 (버튼)과 해당 속성 만 작업 할 수 있습니다. 객체의 특정 속성을 가져와야하는 경우 첫 번째 옵션을 사용하는 것이 좋습니다.

작은 이벤트 클릭 이벤트가있는 목록 상자에 10 개의 단추를 추가하여 기능을 보여주는 예제입니다. HTH

DataTemplate을 XAML은

<UserControl.Resources> 
    <DataTemplate x:Name="MyDataTemplate"> 
     <Grid> 
      <Button Click="Button_Click" Content="{Binding ItemText}"/> 
     </Grid> 
    </DataTemplate> 
</UserControl.Resources> 

옵니다의 XAML 내가 어떻게 할 것인지

public class MyClass 
{ 
    public string ItemText { get; set; } 
} 


public partial class Page : UserControl 
{ 
    ObservableCollection<MyClass> _Items; 
    public Page() 
    { 
     InitializeComponent(); 

     _Items = new ObservableCollection<MyClass>(); 

     for (int i = 0; i < 10; i++) 
     { 
      _Items.Add(new MyClass() {ItemText= string.Format("Item - {0}", i)}); 
     } 

     this.ListBoxThingee.ItemsSource = _Items; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Button _b = sender as Button; 
     if (_b != null) 
     { 
      string _s = _b.Content as string; 
      MessageBox.Show(_s); 
     } 

    } 
} 
2

작성 (난 그냥 모든 page.xaml 파일에이 연결의 뒤에

<ListBox x:Name="ListBoxThingee" ItemTemplate="{StaticResource MyDataTemplate}"/> 

코드입니다

클릭 핸들링을 위해 명령 패턴을 사용하는 버튼 .NET 4 프레임 워크에서는 다음을 바인딩 할 수 있습니다. commands을 뷰 모델에있는 뷰에 추가하십시오.