wpf - 如何通过触发器更改 IsReadOnly

标签 wpf mvvm binding datagrid triggers

任何人都可以启发我以下不起作用的方式

我正在使用 mvvm 模式
执行我的代码后,我仍然能够选中和取消选中 DataGridCheckBoxColumn 中的复选框

属性(我的 ViewModel 的一部分)

    public bool noCheckPermission
    {
        get { return false; } // just as example
    }

Xaml(我的 View 没有隐藏代码)

<DataGrid Height="300" AutoGenerateColumns="False" SelectionMode="Single"
          ItemsSource="{Binding Itemlist, UpdateSourceTrigger=PropertyChanged}">
            <DataGrid.Resources>
                <Style TargetType="{x:Type DataGridCheckBoxColumn}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding noCheckPermission}" Value="False">
                            <Setter Property="IsReadOnly" Value="True"/>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding noCheckPermission}" Value="True">
                            <Setter Property="IsReadOnly" Value="False"/>
                        </DataTrigger>    
                    </Style.Triggers>
                </Style>
            </DataGrid.Resources>
            <DataGrid.Columns>                    
                <DataGridCheckBoxColumn Width="60" 
                                    Header="Freigabe" Binding="{Binding FreigegebenL}" CanUserReorder="False">
                </DataGridCheckBoxColumn>               
            </DataGrid.Columns>                
        </DataGrid>

编辑: 在做了 blindmeis 和 Will 的建议之后。我得到这个作为我当前的 XAML

 <DataGrid Height="300" Margin="12" AutoGenerateColumns="False"  CanUserAddRows="False" CanUserDeleteRows="False"
                  CanUserResizeColumns="False" CanUserResizeRows="False" CanUserReorderColumns="False"
                  x:Name="grd" ItemsSource="{Binding Itemlist, UpdateSourceTrigger=PropertyChanged}" 
                  SelectedItem="{Binding selectedItem, UpdateSourceTrigger=PropertyChanged}" SelectionMode="Single" SelectionChanged="DataGrid_SelectionChanged" TabIndex="2">
            <DataGrid.Columns>
                <DataGridCheckBoxColumn Width="60" IsReadOnly="{Binding  DataContext, Path=noCheckPermission, ElementName=grd}" Binding="{Binding FreigegebenL}"
                                    Header="Freigabe"  CanUserReorder="False">
                </DataGridCheckBoxColumn>               
            </DataGrid.Columns>
        </DataGrid>

这是我的输出窗口中的错误:
System.Windows.Data 错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。绑定(bind)表达式:Path=noCheckPermission;数据项=空;目标元素是“DataGridCheckBoxColumn”(HashCode=35155182);目标属性是“IsReadOnly”(类型“ bool 值”)

最佳答案

首先
我注意到我的属性在错误的 VM 中(它在我的行的子 VM 中)解决这个问题并没有解决我的问题

终于
看完this article我能够解决它

简明形式

public class BindingProxy : Freezable
{
    #region Overrides of Freezable

    protected override Freezable CreateInstanceCore()
    {
        return new BindingProxy();
    }

    #endregion

    public object Data
    {
        get { return (object)GetValue(DataProperty); }
        set { SetValue(DataProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Data.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty DataProperty =
        DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
}

XAML

资源

<DataGrid.Resources>
    <local:BindingProxy x:Key="proxy" Data="{Binding}" />
</DataGrid.Resources>

   <DataGridCheckBoxColumn Width="60" Header="Freigabe"  CanUserReorder="False"
                            IsReadOnly="{Binding Data.noCheckPermission, Source={StaticResource proxy}}" 
                            Binding="{Binding FreigegebenL}"/>

关于wpf - 如何通过触发器更改 IsReadOnly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16083037/

相关文章:

c# - 双向绑定(bind)到基本数据类型数组

mvvm - 绑定(bind)到 View 模型 xamarin.forms 中的属性

c# - WPF 中的转换

c# - 如何创建一个用线条连接两个列表项的控件?

wpf - 如何刷新多重绑定(bind)

asp.net-mvc - 在 ASP.NET MVC2 中具有 SelectList 绑定(bind)的 ViewModel

node.js - 更新 Electron 版本后异常无法找到绑定(bind)文件

wpf - 如何将 ViewBox 转换为 ImageSource?

c# - 通过句柄托管 Win32、WinForms 或 WPF 窗口?

wpf - 键绑定(bind)问题