以下示例在ListBox中成功显示了属性标题,但有没有办法显示方法 GetTitle(),这样我就不必全部转我的方法进入属性?
e.g。这些似乎都不起作用:
<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>
代码隐藏:
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 + ")";
}
}
}
答案 0 :(得分:2)
可能通过ObjectDataProvider。见http://bea.stollnitz.com/blog/?p=22
<ObjectDataProvider ObjectInstance="{StaticResource odp1}" MethodName="WeightOnPlanet" x:Key="odp2">
<ObjectDataProvider.MethodParameters>
<system:Double>95</system:Double>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
或者自己编写Markup Extension。见http://joyfulwpf.blogspot.com/2008/12/creating-custom-wpf-markup-extension-to.html
答案 1 :(得分:2)
使用列表框的'DisplayMember'属性不是更容易吗? 我建议使用Properties而不是Methods,因此数据绑定和NotifyPropertyChanged按预期工作。我不认为绑定到方法实际上会起作用......
像这样:<ListBox DockPanel.Dock="Top" ItemsSource="{Binding BackupTasks}"
DisplayMemberPath="Title" Margin="0 10 0 0">
希望这有帮助, [R