通过单击“按钮-MVVM”启用DataGridView



我几乎没有问题。我得到了一些数据的DataGridView。内部数据杂志是复选框。对于我的应用程序,我使用MVVM模式。现在我想做的。我有按钮,必须启用datagrid。在XAML中,我基于检查复选框的某些多重触发条件禁用了DataGrid。但是,我想通过单击按钮允许用户启用datagrid。我不确定如何以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。有小费吗?非常感谢!

如果使用itemscontrol,则不要将datagrid作为命令参数传递到按钮命令,而是命名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;

使用背后的代码从未违反MVVM,也不会。您正在谈论的违规行为正在使用影响背后代码的ViewModel。您可以使用背后的代码来影响视图(XAML(,并且不违反模式 - 背后的代码仅用于查看内容。

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

有一种方法可以在视图模型中访问您的网格,尽管它可能会稍微打破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;
    }

您必须在视图模型中添加和使用控件的名称空间参考

最新更新