选择数据模板中的控件时获取行详细信息
Get the row details when a control in data template is selected
我正在构建 WPF 应用程序并尝试尽可能坚持 MVVM 模式。我有一个列表框,里面有一个数据模板,其中包含 TextBlock
和 Button
。如果单击数据模板中的按钮,它不会 select 整行,所以我不知道它属于哪一行。我想抓取整个对象并将其绑定到视图模型中的 属性 。我能得到一些帮助或解决方法吗?请坚持使用 mvvm 模式。
带有项目模板的列表框
<telerik:RadListBox Width="200" Height="150" HorizontalAlignment="Left" Margin="10" ItemsSource="{Binding ListOfSupplierInvoices}"
SelectedItem="{Binding SelectedSupplierInvoice, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<telerik:RadListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch" >
<TextBlock Text="{Binding InvoiceNumber}" HorizontalAlignment="Left" Margin="5" ></TextBlock>
<telerik:RadButton Height="20" >
<telerik:RadButton.Content>
<Image Source="/ImageResources/Misc/delete.png" Stretch="Fill" />
</telerik:RadButton.Content>
</telerik:RadButton>
</StackPanel>
</DataTemplate>
</telerik:RadListBox.ItemTemplate>
</telerik:RadListBox>
它在视图中的样子:
据我了解你的代码,按钮对应一个删除命令,这意味着你要删除与按钮关联的项目。在这种情况下,选择可能不需要更改,您只需将当前项目传递给删除命令即可。
向您的视图模型添加一个 Delete
命令,如下所示:
public class MyViewModel : ViewModelBase
{
public MyViewModel()
{
Delete = new DelegateCommand(ExecuteDelete, CanExecuteDelete);
// ...other code.
}
public ICommand Delete { get; }
private void ExecuteDelete(object obj)
{
var invoiceItem = (InvoiceItem) obj;
// Use this only if you need the item to be selected.
// SelectedSupplierInvoice = invoiceItem;
// ...your delete logic.
}
private bool CanExecuteDelete(object obj)
{
// ...your can execute delete logic.
}
// ...other code.
}
注意我引入InvoiceItem
作为物品类型,因为我不知道你的物品类型,简单地适应它。 Delete
命令获取作为参数传递的当前项。如果你可以随时删除该项目,则无需选择它,因为它会在之后消失。
否则,取消注释该行,以便将 SelectedSupplierInvoice
设置为将通过双向绑定自动更新用户界面的项目(如果您已实现公开 [=19] 的 INotifyPropertyChanged
correctly or derive from ViewModelBase
=] 或 OnPropertyChanged
方法,例如:
private InvoiceItem _selectedSupplierInvoice;
public InvoiceItem SelectedSupplierInvoice
{
get => _selectedSupplierInvoice;
set
{
if (_selectedSupplierInvoice == value)
return;
_selectedSupplierInvoice = value;
RaisePropertyChanged();
}
}
在您的 XAML 中,将按钮连接到 RadListBox
的 DataContext
上的 Delete
命令。
<telerik:RadButton Height="20"
Command="{Binding DataContext.Delete, RelativeSource={RelativeSource AncestorType={x:Type telerik:RadListBox}}}"
CommandParameter="{Binding}">
<telerik:RadButton.Content>
<Image Source="/ImageResources/Misc/delete.png" Stretch="Fill" />
</telerik:RadButton.Content>
</telerik:RadButton>
我正在构建 WPF 应用程序并尝试尽可能坚持 MVVM 模式。我有一个列表框,里面有一个数据模板,其中包含 TextBlock
和 Button
。如果单击数据模板中的按钮,它不会 select 整行,所以我不知道它属于哪一行。我想抓取整个对象并将其绑定到视图模型中的 属性 。我能得到一些帮助或解决方法吗?请坚持使用 mvvm 模式。
带有项目模板的列表框
<telerik:RadListBox Width="200" Height="150" HorizontalAlignment="Left" Margin="10" ItemsSource="{Binding ListOfSupplierInvoices}"
SelectedItem="{Binding SelectedSupplierInvoice, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<telerik:RadListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch" >
<TextBlock Text="{Binding InvoiceNumber}" HorizontalAlignment="Left" Margin="5" ></TextBlock>
<telerik:RadButton Height="20" >
<telerik:RadButton.Content>
<Image Source="/ImageResources/Misc/delete.png" Stretch="Fill" />
</telerik:RadButton.Content>
</telerik:RadButton>
</StackPanel>
</DataTemplate>
</telerik:RadListBox.ItemTemplate>
</telerik:RadListBox>
它在视图中的样子:
据我了解你的代码,按钮对应一个删除命令,这意味着你要删除与按钮关联的项目。在这种情况下,选择可能不需要更改,您只需将当前项目传递给删除命令即可。
向您的视图模型添加一个 Delete
命令,如下所示:
public class MyViewModel : ViewModelBase
{
public MyViewModel()
{
Delete = new DelegateCommand(ExecuteDelete, CanExecuteDelete);
// ...other code.
}
public ICommand Delete { get; }
private void ExecuteDelete(object obj)
{
var invoiceItem = (InvoiceItem) obj;
// Use this only if you need the item to be selected.
// SelectedSupplierInvoice = invoiceItem;
// ...your delete logic.
}
private bool CanExecuteDelete(object obj)
{
// ...your can execute delete logic.
}
// ...other code.
}
注意我引入InvoiceItem
作为物品类型,因为我不知道你的物品类型,简单地适应它。 Delete
命令获取作为参数传递的当前项。如果你可以随时删除该项目,则无需选择它,因为它会在之后消失。
否则,取消注释该行,以便将 SelectedSupplierInvoice
设置为将通过双向绑定自动更新用户界面的项目(如果您已实现公开 [=19] 的 INotifyPropertyChanged
correctly or derive from ViewModelBase
=] 或 OnPropertyChanged
方法,例如:
private InvoiceItem _selectedSupplierInvoice;
public InvoiceItem SelectedSupplierInvoice
{
get => _selectedSupplierInvoice;
set
{
if (_selectedSupplierInvoice == value)
return;
_selectedSupplierInvoice = value;
RaisePropertyChanged();
}
}
在您的 XAML 中,将按钮连接到 RadListBox
的 DataContext
上的 Delete
命令。
<telerik:RadButton Height="20"
Command="{Binding DataContext.Delete, RelativeSource={RelativeSource AncestorType={x:Type telerik:RadListBox}}}"
CommandParameter="{Binding}">
<telerik:RadButton.Content>
<Image Source="/ImageResources/Misc/delete.png" Stretch="Fill" />
</telerik:RadButton.Content>
</telerik:RadButton>