2009-11-22 3 views
1

다음 예제에서는 ListBox에 Title이라는 제목의 속성이 성공적으로 표시되지만 메서드를 표시 할 방법이 있습니까 GetTitle() 속성에 모든 메서드를 적용 할 필요가 없습니까?메서드를 ListBox의 DataTemplate에 바인딩하는 방법이 있습니까?

이들 중 어느 것도 제대로 작동 :

<TextBlock Text="{Binding GetTitle}"/> 
<TextBlock Text="{Binding GetTitle()}"/> 

XAML :

<Window x:Class="TestBindMethod8938.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <ListBox DockPanel.Dock="Top" ItemsSource="{Binding BackupTasks}" Margin="0 10 0 0"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Title}"/> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </Grid> 
</Window> 

코드 숨김 : ObjectDataProvider 통해 어쩌면

using System.Windows; 
using System.ComponentModel; 
using System.Collections.ObjectModel; 

namespace TestBindMethod8938 
{ 
    public partial class Window1 : Window, INotifyPropertyChanged 
    { 

     #region ViewModelProperty: BackupTasks 
     private ObservableCollection<BackupTask> _backupTasks = new ObservableCollection<BackupTask>(); 
     public ObservableCollection<BackupTask> BackupTasks 
     { 
      get 
      { 
       return _backupTasks; 
      } 

      set 
      { 
       _backupTasks = value; 
       OnPropertyChanged("BackupTasks"); 
      } 
     } 
     #endregion 


     public Window1() 
     { 

      InitializeComponent(); 
      DataContext = this; 

      BackupTasks.Add(new BackupTask(@"c:\test", @"c:\test2")); 

     } 


     #region INotifiedProperty Block 
     public event PropertyChangedEventHandler PropertyChanged; 

     protected void OnPropertyChanged(string propertyName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 

      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
     #endregion 
    } 



    public class BackupTask 
    { 
     public string SourceFolder { get; set; } 
     public string TargetFolder { get; set; } 
     public int NumberOfFilesToBackup { get; set; } 
     public string Title 
     { 
      get 
      { 
       return SourceFolder + " --> " + TargetFolder + " (" + NumberOfFilesToBackup + ")"; 
      } 
      set 
      { 
      } 
     } 

     public BackupTask(string sourceFolder, string targetFolder) 
     { 
      SourceFolder = sourceFolder; 
      TargetFolder = targetFolder; 
     } 

     public string GetTitle() 
     { 
      return SourceFolder + " --> " + TargetFolder + " (" + NumberOfFilesToBackup + ")"; 
     } 


    } 

} 

답변

2

목록 상자의 'DisplayMember'속성을 사용하는 것이 더 쉽지 않습니까? 그리고 Databinding 및 NotifyPropertyChanged가 예상대로 작동하도록 Methods 대신 Properties를 사용하는 것이 좋습니다. 이 같은

... 실제로 작동 방법에 바인딩 생각하지 않는다 :이 도움이

<ListBox DockPanel.Dock="Top" ItemsSource="{Binding BackupTasks}" 
     DisplayMemberPath="Title" Margin="0 10 0 0"> 

희망, R을

관련 문제