【问题标题】:While click on button from one row of datagrid hide buttons on other row在单击一行数据网格中的按钮时,隐藏另一行上的按钮
【发布时间】:2019-05-10 19:44:09
【问题描述】:

我有一个 DataGrid,每行 DataGrid 包含四个按钮。

我的屏幕是这样的。假设我单击添加的开始按钮,然后我希望隐藏其他行上的所有按钮,例如删除、更新和删除,直到我单击添加的完成按钮并在处理完成后从 DataGrid 中删除该添加行。

我的其他功能工作正常,但唯一的问题是我点击添加行然后其他行上的其他按钮也是可点击的,所以我想隐藏它。

请帮我解决这个问题

 <DataGrid Grid.Row="3" Grid.ColumnSpan="2" Name="gridview" Background="#b5d2fc" IsReadOnly="True" ItemsSource="{Binding}" HorizontalScrollBarVisibility="Auto"
         SelectionMode="Single" SelectionUnit="FullRow" VerticalScrollBarVisibility="Auto" Loaded="gridview_Loaded"
        CanUserDeleteRows="False" CanUserAddRows="False" CanUserResizeRows="False"  VerticalAlignment="Top"  AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn MaxWidth="155" Width="155" Binding="{Binding [Task]}" Header="Name"  />
            <DataGridTemplateColumn MaxWidth="30" MinWidth="30">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button x:Name="Start" Content="Play" Click="Button_Click" IsEnabled="{Binding IsEnableButton, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" VerticalAlignment="Top" Foreground="Black" Background="White"  Height="25"  Width="30" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn >
            <DataGridTemplateColumn MaxWidth="30" MinWidth="30">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button x:Name="Pause" Content="Pause" Click="Button_Click" IsEnabled="{Binding IsEnableButton, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" VerticalAlignment="Top" Foreground="Black" Background="White"  Height="25"  Width="30" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn MaxWidth="30" MinWidth="30">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button x:Name="Stop" Content="Stop"   Foreground="Black" Click="Button_Click" IsEnabled="{Binding IsEnableButton, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" VerticalAlignment="Top" Background="White" Height="25"  Width="30" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn MaxWidth="30" MinWidth="30">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button x:Name="Finish" Content="Finish"   Foreground="Black" Click="Button_Click" IsEnabled="{Binding IsEnableButton, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" VerticalAlignment="Top" Background="White" Height="25"  Width="30" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

这是我的 xmal 代码

【问题讨论】:

  • 您必须将属性绑定到按钮的 IsEnabled 属性,实现 INotifyPropertyChanged 并根据您的逻辑在单击按钮时更改相关属性。我认为除此之外没有Minimal, Complete and Verifiable example 的任何人都可以帮助你

标签: c# wpf


【解决方案1】:

您可以通过在按钮控件中绑定 IsEnabled 属性来实现。

xaml sn-p:

<DataGrid Name="MyGrid"  AutoGenerateColumns="False" Loaded="MyGrid_Loaded" Height="250"  >
<DataGrid.Columns>
    <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
    <DataGridTemplateColumn Header="B1">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <Button Content="Start" x:Name="Play" Click="Button_Click" IsEnabled="{Binding IsEnableButton, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Height="20" Width="80"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    <DataGridTemplateColumn Header="B2">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <Button Content="Pause"  x:Name="Pause" Click="Button_Click" IsEnabled="{Binding IsEnableButton, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Height="20" Width="80"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    <DataGridTemplateColumn Header="B3">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <Button Content="Stop"  x:Name="Stop" Click="Button_Click" IsEnabled="{Binding IsEnableButton, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Height="20" Width="80"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    <DataGridTemplateColumn Header="B4">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <Button Content="Finish"  x:Name="Finish" Click="Button_Click" IsEnabled="{Binding IsEnableButton, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Height="20" Width="80"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</DataGrid.Columns>

xaml.cs

                public partial class MainWindow : Window
                {
                    List<TestEnableButton> objtestEnableButton = new List<TestEnableButton>();        
                    public MainWindow()
                    {
                        InitializeComponent();
                        this.DataContext = this;
                    }
                    private void MyGrid_Loaded(object sender, RoutedEventArgs e)
                    {
                        objtestEnableButton.Add(new TestEnableButton("A1", true, false));
                        objtestEnableButton.Add(new TestEnableButton("A2", true, false));
                        objtestEnableButton.Add(new TestEnableButton("A3", true, false));
                        objtestEnableButton.Add(new TestEnableButton("A4", true, false));
                        MyGrid.ItemsSource = objtestEnableButton;
                    }

                    bool butFlg = false;
                    private void Button_Click(object sender, RoutedEventArgs e)
                    {
                        var getButtonName = (sender as Button).Name;
                        var currentItem = MyGrid.CurrentItem as TestEnableButton;
                        foreach(var items in objtestEnableButton)
                        {
                            if (items.Name == currentItem.Name)
                            {
                                if (getButtonName == "Play")
                                {
                                    MessageBox.Show("Let's enjoy music...!)");
                                    butFlg = false;
                                }
                                else if (getButtonName == "Pause")
                                {
                                    MessageBox.Show("Pause the music for few minutes...!)"); butFlg = false;
                                }
                                else if (getButtonName == "Stop")
                                {
                                    MessageBox.Show("Stop the music...!)"); butFlg = false;
                                }
                                else if (getButtonName == "Finish")
                                {
                                    MessageBox.Show("End...!)");                        
                                    items.IsCheckFinish = true;
                                    butFlg = true;
                                }
                            }
                            else
                            {
                                items.IsEnableButton = false;
                            }
                        }

                        if (butFlg)
                        {
                            var itemsCollection = objtestEnableButton.RemoveAll(x => x.IsCheckFinish == true);
                            objtestEnableButton.ForEach(x => x.IsEnableButton = true);
                            MyGrid.ItemsSource = null;
                            MyGrid.ItemsSource = objtestEnableButton;
                        }            
                    }
                }
                public class TestEnableButton : INotifyPropertyChanged
                {
                    private string _name;
                    public string Name
                    {
                        get { return _name; }
                        set
                        {
                            _name = value;
                            OnPropertyChanged("Name");
                        }
                    }

                    private bool _IsEnableButton;
                    public bool IsEnableButton
                    {
                        get { return _IsEnableButton; }
                        set
                        {
                            _IsEnableButton = value;
                            OnPropertyChanged("IsEnableButton");
                        }
                    }

                    private bool _IsCheckFinish;
                    public bool IsCheckFinish
                    {
                        get { return _IsCheckFinish; }
                        set
                        {
                            _IsCheckFinish = value;
                            OnPropertyChanged("IsCheckFinish");
                        }
                    }
                    public TestEnableButton(string name, bool isB, bool isCheck)
                    {
                        Name = name;
                        IsEnableButton = isB;
                        IsCheckFinish = isCheck;
                    }

                    public event PropertyChangedEventHandler PropertyChanged;
                    public void OnPropertyChanged(string propertyName)
                    {
                        if (PropertyChanged != null)
                        {
                            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                        }
                    }
                }

【讨论】:

  • 您的代码运行良好,但我想使用我的代码来实现这一点,我根据我的代码更改了您的代码,您能帮忙吗,请上传我的代码
  • 是的,当然。分享你的代码。你现在遇到了什么问题?
  • 其实我是从数据库中加载数据,如果是Datagrid,我将DataTable指定为项目源
  • 在您的代码 sn-p 上,您没有为按钮设置 IsEnabled 属性。
  • 我想要图像中显示的值,但值是 A1 到 A4,而且我要从 DataTable 中删除
猜你喜欢
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多