使用模型中的委托将函数绑定到ListView中的按钮

时间:2014-03-10 22:00:30

标签: c# wpf data-binding

我是C#的新手,我正在尝试将我的集合中每个项目中的一个函数绑定到该项目的按钮。我的收藏集是List<AssessmentItem>,其中每个AssessmentItem如下:

public class AssessmentItem
{
    public string Label { get; set; }
    public string Explanation { get; set; }
    public string ResourceURL { get; set; }
    public BitmapImage Icon { get; set; }
    public RunFixer Fixer { get; set; }
}

public RunFixer Fixer是我要绑定到特定AssessmentItem按钮的委托。以下是我用来完成计划的DataTemplate

    <DataTemplate x:Key="AssessmentListTemplate">
        <Grid Margin="0,10">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>

            <TextBlock Text="{Binding Label}" FontSize="16" VerticalAlignment="Center" Grid.Column="0" FontWeight="Bold" Margin="15,0,0,0"/>
            <Button Grid.Column="2" Margin="0,0,10,0">
                <Image Source="{Binding Icon}" Width="64" Height="64"/>
            </Button>
        </Grid>
    </DataTemplate>

如何将<Button>的{​​{1}}处理程序绑定到我的Click代理?我试过RunFixer,但没有用。我还将{Binding Fixer}更改为Fixer,但这也无效。

感谢您抽出时间看看这个!我不介意接受教育。


附加

使用

声明MouseButtonEventHandler委托

RunFixer


最终代码

对于我的个人文档和其他人的满意,我发布的结果对我来说效果很好:

public delegate void RunFixer();

public class AssessmentItem { public string Label { get; set; } public string Explanation { get; set; } public string ResourceURL { get; set; } public BitmapImage Icon { get; set; } public RunFixer Fixer { get; set; } DelegateCommand _fixerCommand = null; public ICommand FixerCommand { get { if (_fixerCommand == null) { _fixerCommand = new DelegateCommand(() => Fixer()); } return _fixerCommand; } } }

DataTemplate

希望这有帮助!

2 个答案:

答案 0 :(得分:1)

您无法绑定按钮的“Click”事件,因为它不是依赖项属性(在这种情况下,它是路由事件)。幸运的是,WPF为我们提供了一个按钮的“Command”属性(它是一个依赖属性)!

您的绑定将如下所示:

Command="{Binding RunFixerCommand}"

您的数据对象将公开ICommand属性,该属性将返回调用“RunFixer”的命令对象。可以在this博客文章中找到可重用且易于使用的通用命令类的一个很好的例子。

示例(在您的AssessmentItem类中):

public ICommand RunFixerCommand {get; private set;}

public AssessmentItem()
{
   RunFixerCommand = new DelegateCommand((p) => RunFixer());
}

答案 1 :(得分:1)

您无法将功能绑定到按钮。但是您可以将命令对象绑定到按钮的Command属性。为此,您需要修改您的课程:

public class AssessmentItem
{
    public string Label { get; set; }
    public string Explanation { get; set; }
    public string ResourceURL { get; set; }
    public BitmapImage Icon { get; set; }
    public RunFixer Fixer { get; set; }
    ICommand _fixerCommand = new UICommand();
    public ICommand FixerCommand {
        get
        {
            _fixerCommand = _fixerCommand ?? new DelegateCommand<object>((o)=>
                       {var f = Fixer;
                         if(f != null) f();}); 
            return _fixerCommand;}
        }
}

我正在使用DelegateCommand类,它是Prism library的一部分,可以下载here

然后,您正在修改数据模板以绑定到此FixerCommand属性

    <Button Grid.Column="2" Margin="0,0,10,0" Command ="{Binding FixerCommand}">
        <Image Source="{Binding Icon}" Width="64" Height="64"/>
    </Button>