C# 通过单击按钮启用datagridview-MVVM

C# 通过单击按钮启用datagridview-MVVM,c#,xaml,mvvm,datagrid,C#,Xaml,Mvvm,Datagrid,我没什么问题。我得到了一些数据的datagridview。datagrid中有复选框。对于我的应用程序,我使用MVVM模式。现在我想做什么。我有一个按钮,它必须启用datagrid。在xaml中,我根据复选框的某些multitrigger条件禁用了datagrid。但我想允许用户通过点击按钮来启用datagrid。我不知道如何在MVVM模式下做到这一点。通过使用代码隐藏,我将违反MVVM模式 例如,我的xaml代码中有: <Style TargetType="DataGridRow">

我没什么问题。我得到了一些数据的datagridview。datagrid中有复选框。对于我的应用程序,我使用MVVM模式。现在我想做什么。我有一个按钮,它必须启用datagrid。在xaml中,我根据复选框的某些multitrigger条件禁用了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。有什么建议吗?非常感谢

使用代码隐藏从来没有违反过MVVM,将来也不会。您所说的违规行为正在使用\从代码背后影响ViewModel。您可以使用代码隐藏来影响视图(xaml),并且它不会违反模式-代码隐藏仅用于视图内容


因此,在OP中,您可以使用代码隐藏,而无需转到视图模型。

有一种方法可以在视图模型中访问网格,尽管它可能会稍微打破MVVM惯例,但所有代码都保留在视图模型中

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

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

如果您使用的是ItemsControl,则不要将datagrid作为命令参数传递给button命令,而是将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}">

那可能行得通。但我还有一个小问题。我在ItemsControl中有所有的数据网格,所以在代码隐藏中,我只看到这个ItemsControl的名称,但我看不到网格的名称。有什么解决这个问题的方法吗?我正在尝试使用它,但还有另一个问题。在obj中,它返回空状态。因为我有用户控件,其中是datagrid,主窗口中有按钮。所以这对于绑定来说有点复杂。但我会解决这个问题。你只需要通过可视化树找到你的资源,我只是展示了方法。你不能绑定Datagrid的IsEnabled属性吗?我可以,但它将如何解决这个问题?:)我需要复杂的条件才能启用或不启用datagrid。您正在使用MVVM,因此您的VM必须具有所有属性值。如果您可以检查VM中的所有条件,那么它可以解决您的问题。
<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;