【问题标题】:Is there any way to bind a method to a DataTemplate of a ListBox?有没有办法将方法绑定到 ListBox 的 DataTemplate?
【发布时间】:2010-12-19 04:54:58
【问题描述】:

下面的例子成功的在ListBox中显示了属性Title,但是有没有办法显示方法GetTitle()这样我就不用全部转了我的方法变成了属性?

例如这些似乎都不起作用:

<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 + ")";
        }


    }

}

【问题讨论】:

    标签: c# wpf data-binding xaml listbox


    【解决方案1】:

    也许通过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

    【讨论】:

      【解决方案2】:

      使用列表框的'DisplayMember'属性不是更容易吗? 而且我建议使用属性而不是方法,因此数据绑定和 NotifyPropertyChanged 可以按预期工作。我认为绑定到方法实际上不会起作用...

      像这样:

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

      希望这会有所帮助, 回复

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-25
        • 2012-07-07
        • 1970-01-01
        • 1970-01-01
        • 2011-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多