[英]adding button to datatemplate and calling its click event
I am trying to build a WPF application (using C#.net) in which I want to add button inside ListBox. 我正在尝试构建一个WPF应用程序(使用C#.net),其中我想在ListBox中添加按钮。
Here is the data template which I have placed in the resource dictionary 这是我放在资源字典中的数据模板
<DataTemplate x:Key="MYTemplate">
<StackPanel Margin="4">
<DockPanel>
<TextBlock Text="ISBN No:" DockPanel.Dock="Left" Margin="5,0,10,0" Foreground="AliceBlue" />
<TextBlock Text=" " />
<TextBlock Text="{Binding ISBN}" Foreground="LimeGreen" FontWeight="Bold" />
</DockPanel>
<DockPanel>
<TextBlock Text="Book Name:" DockPanel.Dock="Left" Margin="5,0,10,0" Foreground="AliceBlue"/>
<TextBlock Text=" " />
<TextBlock Text="{Binding BookName}" Foreground="LimeGreen" FontWeight="Bold" />
</DockPanel >
<DockPanel >
<TextBlock Text="Publisher Name:" DockPanel.Dock="Left" Margin="5,0,10,0" Foreground="AliceBlue" />
<TextBlock Text=" " />
<TextBlock Text="{Binding PublisherName}" Foreground="LimeGreen" FontWeight="Bold" />
</DockPanel>
<DockPanel>
<Button Name="MyButton" Content="Click Me">
</Button>
</DockPanel>
</StackPanel>
</DataTemplate>
How do add the click event to the button tag in the above template? 如何将click事件添加到上述模板中的button标签? Also where should I place the method which will be called when button is clicked.
另外,我应该在何处放置单击按钮时将调用的方法。
Nilesh, Nilesh制作,
you should be using binding the button to a command. 你应该使用将按钮绑定到命令。 For example if your data item is defined like this:
例如,如果您的数据项定义如下:
public class MyItem : ViewModelBase
{
public MyItem()
{
ClickMeCommand = new RelayCommand(ClickMe);
}
private void ClickMe()
{
Debug.WriteLine("I was clicked");
}
public string ISBN { get; set; }
public string BookName { get; set; }
public string PublisherName { get; set; }
public ICommand ClickMeCommand { get; set; }
}
Then this will invoke the ClickMe method. 然后这将调用ClickMe方法。
<DockPanel>
<Button Content="Click Me" Command="{Binding ClickMeCommand}" />
</DockPanel>
Or you can put the command in the parent view model: 或者您可以将命令放在父视图模型中:
public class MainViewModel : ViewModelBase
{
public IEnumerable<MyItem> Items { get; private set; }
/// <summary>
/// Initializes a new instance of the MainViewModel class.
/// </summary>
public MainViewModel()
{
Items = new List<MyItem>
{
new MyItem{ ISBN = "ISBN", BookName = "Book", PublisherName = "Publisher"}
};
ClickMeCommand = new RelayCommand<MyItem>(ClickMe);
}
private void ClickMe(MyItem item)
{
Debug.WriteLine(string.Format("This book was clicked: {0}", item.BookName));
}
public ICommand ClickMeCommand { get; set; }
} }
and bind to that 并绑定到那个
<DockPanel>
<Button Content="Click Me" CommandParameter="{Binding}" Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBox}}, Path=DataContext.ClickMeCommand}" />
</DockPanel>
Note that the code above is using MVVM light and I'm assuming you have 请注意,上面的代码使用MVVM灯,我假设你有
<ListBox ItemTemplate="{StaticResource MyTemplate}" ItemsSource="{Binding Items}"/>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.