【问题标题】:Enable datagridview by click on button - MVVM通过单击按钮启用 datagridview - MVVM
【发布时间】:2017-05-02 06:41:12
【问题描述】:

我有一点问题。我得到了一些数据的datagridview。内部数据网格是复选框。对于我的应用程序,我使用 MVVM 模式。现在我想做什么。我有按钮,它必须启用数据网格。在 xaml 中,我有一些基于选中复选框的多触发条件禁用了数据网格。但我想允许用户通过单击按钮启用数据网格。我不知道如何在 MVVM 模式中做到这一点。使用后面的代码将违反 MVVM 模式。

例如,我的 xaml 代码中有这个:

<Style TargetType="DataGridRow">
                                        <Style.Triggers>                                               
                                                <!--Je-li truck ve stavu nakládá, pak povol naložit, pokud naložený již není. Pokud je naložen, řádek je nepřístupný.-->
                                                <MultiDataTrigger>
                                                    <MultiDataTrigger.Conditions>
                                                        <Condition Binding="{Binding DataContext.EntityNotifiedTruck.ConvertEnumToStr, RelativeSource={RelativeSource AncestorType=local:UCDeliveryDetail}, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Value="Nakládá" />
                                                        <Condition Binding="{Binding IsLoaded,UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Value="True" />                                                            
                                                </MultiDataTrigger.Conditions>
                                                    <Setter Property="IsEnabled" Value="False" />

                                            </MultiDataTrigger>
                                                <MultiDataTrigger>
                                                    <MultiDataTrigger.Conditions>
                                                        <Condition Binding="{Binding DataContext.EntityNotifiedTruck.ConvertEnumToStr, RelativeSource={RelativeSource AncestorType=local:UCDeliveryDetail}, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Value="Nakládá" />
                                                        <Condition Binding="{Binding IsLoaded,UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Value="False" />
                                                    </MultiDataTrigger.Conditions>
                                                    <Setter Property="IsEnabled" Value="True"/>

还有这个

  <Button Content="ODBLOKOVAT VÝKLADKU" Command="{Binding UnLoadTruckCmd}" CommandParameter="{Binding}" HorizontalAlignment="Left" Margin="865,5,0,0" Style="{StaticResource DialogButton}" VerticalAlignment="Top" Width="Auto" Height="22">
 </Button>

是我的带有命令的按钮,如果被禁用,我想允许用户再次启用数据网格。有小费吗?非常感谢!

【问题讨论】:

  • 不能绑定Datagrid的IsEnabled属性吗?
  • 我可以,但如何解决这个问题? :) 可以启用或不启用数据网格时,我需要复杂的条件。
  • 您正在使用 MVVM,因此您的 VM 必须具有所有属性值。如果您可以检查VM中的所有条件,那么它可以解决您的问题。

标签: c# xaml mvvm datagrid


【解决方案1】:

如果您使用 ItemsControl,那么不要将数据网格作为命令参数传递给按钮命令,而是将 ItemsControl 命名并传递如下:

<ItemsControl x:Name="ItemsControl1" Grid.Column="1" Grid.Row="4" ItemsSource="{Binding Path=TestCollection}" HorizontalAlignment="Center" HorizontalContentAlignment="Stretch">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <DataGrid Name="dgDatagrid" AutoGenerateColumns="False" IsReadOnly="True" Margin="2,0,2,2" ItemsSource="{Binding}">

.....

在视图模型中使用以下内容访问数据网格:

System.Windows.Controls.ItemsControl _itemsControl = parameter as System.Windows.Controls.ItemsControl;
System.Windows.Controls.DataGrid dataGrid = _itemsControl.FindName("dgDatagrid") as System.Windows.Controls.DataGrid;

【讨论】:

    【解决方案2】:

    使用背后的代码从来都不会违反 MVVM,以后也不会。您正在谈论的违规行为是从后面的代码中使用\影响 ViewModel。您可以使用后面的代码来影响视图 (xaml),并且它不会违反模式 - 后面的代码仅适用于视图。

    因此,在您的 OP 中,您可以使用后面的代码,而无需转到 ViewModel。

    【讨论】:

      【解决方案3】:

      有一种方法可以在视图模型中访问您的网格,尽管它可能会稍微违反 MVVM 约定,但所有代码仍保留在视图模型中。

      <Button x:Name="btnTest" Grid.Column="0" Grid.Row="3" Content="Test" Command="{Binding TestCommand}" CommandParameter="{Binding ElementName=dgDatagrid}"/>
      

      "dgDatagrid" 是 xaml 中我的数据网格的名称,它作为命令参数传递。 这是我在视图模型中的命令:

      testCommand = new RelayCommand(ExecuteTest);
      private void ExecuteTest(object parameter)
          {
              System.Windows.Controls.DataGrid grid = parameter as System.Windows.Controls.DataGrid;
              grid.IsEnabled = true/false;
          }
      

      您必须在视图模型中添加和使用控件的命名空间引用,但如果您想避免代码隐藏文件中的代码,这是唯一的方法。

      【讨论】:

      • 这可能行得通。但我还有一个小问题。我在 ItemsControl 中有所有数据网格 - 所以在后面的代码中我只看到这个 ItemsControl 的名称,但我看不到网格的名称。任何提示如何解决这个问题?
      • 我正在尝试使用它,但还有另一个问题。在 obj 中,它返回 null 状态。因为我有用户控件,其中是数据网格和主窗口,我有按钮。所以这对于绑定来说有点复杂。但我会解决这个问题。
      • 你只需要通过可视化树找到你的资源,我只是展示了方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-08
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      相关资源
      最近更新 更多