簡體   English   中英

通過 xNames 訪問 WPF Datagrid 中自動生成的按鈕

[英]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。

https://learn.microsoft.com/en-us/do.net/api/system.windows.input.icommand.canexecute?view.net-7.0#system-windows-input-icommand-canexecute(系統對象)

如果返回 false,那么該按鈕將被禁用並且不會運行。

https://learn.microsoft.com/en-us/answers/questions/433293/mvvm-relaycommand-icommand

社區工具包 mvvm 使定義命令變得非常容易。

https://blogs.msmvps.com/bsonnino/2022/08/06/the-mvvm-pattern-revisited-with-the-mvvm-community-toolkit-8-0/

這里最后一個 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM