[英]Access auto generated buttons inside WPF Datagrid by their xNames
我有這個 DataGrid 充滿了產品和庫存以及每個項目的自動生成按鈕,我想使用那里的 xNames 調用這個自動生成的按鈕,這樣當特定項目的庫存變為 0 時,我將簡單地禁用它的按鈕也是自動生成的,但我的問題是我不能調用它。
我在數據網格中使用 FindNames 嘗試了很多,但仍然無法正常工作\
<DataGrid.Columns>
<DataGridTextColumn IsReadOnly="True" Binding="{Binding id}" Header="Product ID" Width="Auto"></DataGridTextColumn>
<DataGridTextColumn ElementStyle="{StaticResource ProductNameCellMargin}" IsReadOnly="True" Binding="{Binding item_name}" Header="Product Name" Width="*"></DataGridTextColumn>
<DataGridTextColumn ElementStyle="{StaticResource ProductNameCellMargin}" IsReadOnly="True" Binding="{Binding item_price}" Header="Price" Width="*"></DataGridTextColumn>
<DataGridTextColumn ElementStyle="{StaticResource ProductNameCellMargin}" IsReadOnly="True" Binding="{Binding item_quantity}" Header="Quantity" Width="*"></DataGridTextColumn>
<DataGridTemplateColumn IsReadOnly="True" HeaderStyle="{StaticResource CenterGridHeaderStyle}" Header="Remove" MinWidth="50" CanUserSort="False" CanUserResize="False">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Background="Transparent" BorderBrush="Transparent" x:Name="select_item_btn" Padding="5, 2, 5, 2" Cursor="Hand" Click="remove_btn_Click">
<DockPanel>
<Image Height="18" Width="19" Source="img/Remove.png" />
</DockPanel>
<Button.Style>
<Style TargetType="Button">
<Setter Property="Background" Value="LightGray"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border Background="{TemplateBinding Background}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="LightGray"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
您可以使用DataTrigger
根據某些源屬性的值禁用Button
,例如:
<Button Background="Transparent" BorderBrush="Transparent" x:Name="select_item_btn"
Padding="5, 2, 5, 2" Cursor="Hand" Click="remove_btn_Click">
<DockPanel>
<Image Height="18" Width="19" Source="img/Remove.png" />
</DockPanel>
<Button.Style>
<Style TargetType="Button">
<Setter Property="Background" Value="LightGray"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border Background="{TemplateBinding Background}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding item_quantity}" Value="0">
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="LightGray"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
當item_quantity
屬性為0
時,上面的示例標記應該禁用Button
。
wpf 通常不處理點擊事件,而是使用帶有按鈕的命令。 將按鈕的命令屬性綁定到父數據上下文/視圖模型或項目視圖模型中的 icommand。
ICommand 有 CanExecute。
如果返回 false,那么該按鈕將被禁用並且不會運行。
https://learn.microsoft.com/en-us/answers/questions/433293/mvvm-relaycommand-icommand
社區工具包 mvvm 使定義命令變得非常容易。
這里最后一個 lambda 表達式是可以執行的:
RemoveCommand = new RelayCommand(DoRemove, () => SelectedCustomer != null);
你會以某種方式檢查股票而不是 selectedcustomer,更像是:
RemoveCommand = new RelayCommand(DoRemove, () => StockLevel > 0);
但是,如文章所示,您可以改用屬性
[RelayCommand(CanExecute = "HasStock")]
private void Remove()
我不確定刪除按鈕的作用,但如果要從數據網格中刪除給定的行,您可能需要該行的命令參數和父視圖模型中的命令。
RelayCommand 旨在接收其方法的參數。
如果需要,相對源綁定將允許您從按鈕綁定到 DataContext.RemoveCommand。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.