如何通过Trigger更改IsReadOnly(How to change IsReadOnly by Trigger)

任何人都可以通过以下方式不起作用

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

属性(我的ViewModel的一部分)

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

Xaml(我的观点没有代码背后)

<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和威尔建议。 我把它作为我目前的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 Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=noCheckPermission; DataItem=null; target element is 'DataGridCheckBoxColumn' (HashCode=35155182); target property is 'IsReadOnly' (type 'Boolean')


can anybody enlight me way the following doesn't work

i'm using the mvvm pattern
after executing my code i'm still able to check and uncheck the Checkboxes in my DataGridCheckBoxColumn

Property (part of my ViewModel)

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

Xaml (my View no code behind)

<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>

Edit: after doing what blindmeis and Will suggested. I got this as my current 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>

and this as Error in my Output Window:
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=noCheckPermission; DataItem=null; target element is 'DataGridCheckBoxColumn' (HashCode=35155182); target property is 'IsReadOnly' (type 'Boolean')


原文:https://stackoverflow.com/questions/16083037
2021-02-19 18:02

满意答案

第一
我注意到我的属性是在错误的VM(它在Child VM中是我的行)修复这个并没有解决我的问题

最后
读完这篇文章后,我能够解决它

以浓缩的形式

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}"/>

first
i noticed that my property was in the wrong VM (it was in the Child VM which are my rows) fixing this doesn't solved my problem

finally
after reading this article i was able to solve it

in condensed form

class

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

Resources

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

Column

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

相关问答

更多

ICollection的合约 .IsReadOnly(Contract of ICollection.IsReadOnly)

还有其他事情要考虑...... 你的集合是一个数组包装器,它有一些类似数组的语义。 即项目不能被插入或移除,但可以修改。 对于IsReadOnly ,数组返回false ,对于IsFixedSize返回true 。 我认为除IList<T>之外,我可能会实现IList ,然后模仿数组行为,就IsReadOnly和IsFixedSize而言。 MSDN评论中的关键词是“or”: 只读集合不允许在创建集合之后添加,删除或修改元素。 您的收藏确实允许修改,因此在我看来,对于IsReadOnly返回tru...

如何在C#中重写List .IsReadOnly(How to override List.IsReadOnly in C#)

在这种情况下,使用封装而不是继承。 你应该让你的类实现IList <T>,并拥有一个私有的List <T>变量。 你可以通过你想要的任何函数,但也可以完全覆盖它们,改变行为等。这使你完全控制(代价是有许多方法除了调用this.List.method(...)之外什么都不做) 。 一般来说,我认为在任何情况下从BCL集合类继承都不是一个好主意。 我更喜欢将它们作为我班级内部的实现细节。 Use encapsulation instead of inheritance in this case. Yo...

.trigger(“更改”)页面不断重新加载页面(.trigger(“change”) page keep reloading the page)

var e = document.getElementById("Sortby"); var strUser = e.options[e.selectedIndex].text; document.getElementById("sortByText").innerHTML=strUser; var e = document.getElementById("Sortby"); var strUser = e.options[e.selectedIndex].text; document.getE...

MahApps DataGridCheckBoxColumn IsReadOnly属性(MahApps DataGridCheckBoxColumn IsReadOnly property)

我找到了解决我的问题的方法 - 感谢这篇MSDN文章 我已更新我的DataGrid以便DataGrid.Columns包含以下DataGridCheckBoxColumn <DataGridCheckBoxColumn Binding="{Binding Process}" ElementStyle="{DynamicResource MetroDataGridCheckBox}" EditingEl...

WPF:两个DataGrids,相同的ItemsSource,一个IsReadOnly,Bug?(WPF: Two DataGrids, same ItemsSource, One IsReadOnly, Bug?)

我认为正在发生的事情是IsReadOnly属性通过DefaultView为persons创建DataGrid ,并且因为这两个DataGrid's DefaultView都是相同DataGrid's ,所以两者都失去了添加新行的能力。 然而,两者都不会变成只读(正如你在问题中所说的那样)所以我不确定这是一个错误还是一个想要的行为。 我也不确定这里会发生什么导致这种行为,但你可以通过调试器验证CollectionView是否相同(因为CollectionView属性是私有的)。 以下三个陈述是真实的...

XAML TextBox isReadOnly Binding(XAML TextBox isReadOnly Binding)

尝试这个。 <page X:name="PageName"> IsReadOnly="{Binding ElementName=PageName,Path=setread, Mode=OneWay}" try this. <page X:name="PageName"> IsReadOnly="{Binding ElementName=PageName,Path=setread, Mode=OneWay}"

如何使用XAML在Panel或GroupBox等整个容器上设置IsReadOnly / IsEnabled?(How to set IsReadOnly / IsEnabled on entire container like Panel or GroupBox using XAML?)

对我们来说很好的一点是定义一个视图模型来代表你的应用程序的权限结构(YourPermissionsViewModel在我的例子中)。 然后,您可以创建自定义面板控件,以扩展您选择的任何面板(本例中为StackPanel)。 通过这种方式,您可以添加IsReadOnly属性绑定并将其保存到面板的子项中。 以下是XAML中的面板的外观: <local:PanelExtension IsEnabled="{Binding YourPermissionsViewModel.IsEnabled}" ...

当DataGrid的IsReadOnly = FALSE时,WPF DataGridComboBoxColumn的ComboBox才可见(WPF DataGridComboBoxColumn`s ComboBox is only visible when DataGrid has IsReadOnly=FALSE)

所有内置的DataGridColumns都有两种样式。 一个用于单元格未处于编辑模式,另一个单元格处于编辑模式。 通常情况下,非编辑模式只是显示一个文本块,而不是您可能期望的实际控件(组合框,文本框等)。 一旦开始编辑单元格,文本块将被替换为适当的控件。 如果您将datagrid设置为IsReadOnly = true,那么这意味着单元格永远不会进入其编辑模式,这就是您所看到的行为。 在创建DataGridTemplateColumn时,您必须替换所有内置的datagrid逻辑。 作为一个例子,如...

当IsReadOnly为true时,RichTextBox忽略击键(Home,End,PgUp,PgDn)(RichTextBox ignores keystrokes (Home,End,PgUp,PgDn) when IsReadOnly is true)

将IsReadOnlyCaretVisible设置为True <RichTextBox IsReadOnly="True" IsReadOnlyCaretVisible="True" ... /> 如果您不希望看到插入符,请将CaretBrush设置为Transparent <RichTextBox IsReadOnly="True" IsReadOnlyCaretVisible="True" ...

如何通过Trigger更改IsReadOnly(How to change IsReadOnly by Trigger)

第一 我注意到我的属性是在错误的VM(它在Child VM中是我的行)修复这个并没有解决我的问题 最后 读完这篇文章后,我能够解决它 以浓缩的形式 类 public class BindingProxy : Freezable { #region Overrides of Freezable protected override Freezable CreateInstanceCore() { return new BindingProxy(); ...

相关文章

更多

CentOS 6.3 更改yum源,改为163源

安装软件时,出现以下错误 http://centos.ustc.edu.cn/centos/6.4/o ...

更改我的网页默认的暴风影音播放器

可以从根本上设置一下.开始→设置→控制面版→添加或删除程序→设定程序访问和默认值→选中[自定义&quo ...

eclipse的默认(打开)编辑器的更改

eclipse / MyEclipse JSP默认打开方式是 MyEclipse Visual JSP ...

马士兵oracle视频教程

source source.rar 53_尚学堂数据库教程_recursion_2.avi 52_尚学 ...

Quartz入门例子简介 从入门到菜鸟(四)

对于实现StatefulJob接口的 两个或多个有状态的 JobDetail 实例不能并发执行。说的是 ...

Object Oriented Programming

Some might also contend that inheritance should be ...

solr中重建索引

Stop your application server Change your schema.xml ...

变量可变性问题

从FP的角度, Clojure中变量是不可变的, 改变一个变量实际是创建一个新的变量 所以所有的cha ...

junit怎么用?

写了个很简单的测试用例,可是老是显示测试失败。netbean6.7.1 被测试类: package ...

Quartz 入门示例程序

Quartz2 两个 SimpleTrigger 和 CronTrigger 完整的例子

最新问答

更多

公共表格表达的PIVOT(PIVOT on Common Table Expression)

WITH details AS ( SELECT FldId ,Rev ,Words ,row_number() OVER ( PARTITION BY FldId ORDER BY Rev DESC ) AS rn FROM WorkItemLongTexts WHERE ID = 2855

spring-ws-security依赖冲突(spring-ws-security dependency conflict)

问题是你已经包含了一个与更新版本相同的依赖关系我认为这样做可以解决它。 将它添加到spring-ws-security依赖声明中。 org.apache.santuario xmlsec Problem is you are already in

redis set集合如何去重

$key = 'URL_HASH'; if(!$redis->hGet($key, md5($url))){ // do something ... // 抓取一个 $url 后 $redis->hSet($key, md5($url), true); } 这里需要注意的是,如果是多线程的,要考虑其他进程,可以吧 bool 值改为枚举值。

在IE中传递ac#文本框作为javascript参数(Chrome作品)(Passing a c# Textbox as a javascript parameter in IE (Chrome works))

用引号括起<%=TextTitu.ClientID%> ,如下所示: ChangeText("<%=TextTitu.ClientID%>", "", ""); 您当前的代码评估为: ChangeText(ctl00_c_area_conteudo_TextTitu, "", ""); 但ctl00_c_area_conteudo_TextTitu没有在任何地方定义为变量,这就是错误引发的原因。 将其包含在引号中后,代码将评估为: ChangeText("ctl0

调用sw程序时地址超出范围(address out of range when calling sw procedure)

sw是一个指令 ,而不是一个程序。 无论如何, sw的目的是将寄存器的内容存储在内存中。 这听起来像你只是想将一个寄存器的内容复制到另一个寄存器,所以你应该使用的指令是move : move $t3,$v0 # $t3 = $v0 同样的事情可以通过其他几种方式实现,例如: or $t3,$v0,$zero 但如果你刚开始使用MIPS汇编,我建议你只使用move 。 sw is an instruction, not a procedure. Anyway, the purpose o

中出是什么意思啊?

日语“中出し”,即“膣内*中出*(体内中出)”的俗称,目前已成为青少年间新兴网络用语。关于“体内中出”,请参考“安全性行为”。 日语,念shiroto ,指非专业人士,业余爱好者,业余艺术家,跟英文Amateur的意思是一样,有时也指良家妇女。

在Android中创建ViewPager或等效的WITH功能(Create a ViewPager or equivalent WITH functionality in Android)

将Activity作为ViewPager的一部分是不可能的,但是没有理由不能将您描述的功能添加到ViewPager中的每个页面。 要为每个视图中的组件分配交互或事件,只需在每个case语句中的instantiateItem()中添加正确的侦听器: case 0: v = inflater.inflate(R.layout.dashboard_social, null); Button myButton = (Button) v.findViewById(R.id.name

如何在Windows启动时自动启动应用程序?(How to make an application automatically start at Windows start?)

如果它自动启动你可以使它成为一个Windows服务,或者你可以简单地将它放在Windows启动文件夹中,它将自动启动它。 对于系统托盘,您应该查看NotifyIcon控件。 As far as having it start automatically you can make it a windows service or you can simply place it in the windows startup folder and it will automatically launch

如何在javafx和scenebuilder中单击按钮时创建新标签?(How to create a new label when a button is clicked in javafx and scenebuilder?)

让我们制作一个窗格并在scenebuilder中设置fx:id(paneLoadLabel) 在控制器中写下这个 @FXML private Pane panelLoadLabel; @FXML public void enterTextMouse(MouseEvent e){ Label lbl1 = new Label(txtCmd.getText()); paneLoadLabel.getChildren().add(lbl1); } Let's make one pa