【问题标题】:How to change IsReadOnly by Trigger如何通过触发器更改 IsReadOnly
【发布时间】:2013-04-11 13:44:57
【问题描述】:

谁能启发我以下方法不起作用

我正在使用 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>

编辑: 在做了盲人和威尔建议的事情之后。我把它作为我当前的 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')

【问题讨论】:

  • //just an example 呃,没有看到那个代码没有人可以帮助你。它是触发数据触发器的属性的更改通知。如果视图模型中的属性没有更改通知,则不会显示对属性的更改。如果没有该代码,我们无法判断您是否拥有此代码。
  • @我是否也使用这个修复值(目前没有逻辑......)
  • 明白。接下来你需要做的是打开数据绑定的调试消息:i.stack.imgur.com/MF8i5.png 接下来,重新运行并检查输出窗口,看看有什么错误。
  • @Will 看起来它没有被调用,但我所有其他属性都工作正常我还在星期二对拼写进行三次检查(这是我昨天能弄清楚的最后一件事)我会测试你的建议我也会窥探它,也许会找到一些东西
  • @在我的输出窗口中我不会得到任何与 DataBinding 问题有关的信息吗?您知道如何调试触发器吗?

标签: wpf mvvm binding datagrid triggers


【解决方案1】:

第一
我注意到我的财产在错误的虚拟机中(它在我的行的子虚拟机中)修复这个并没有解决我的问题

终于
在阅读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}"/>

【讨论】:

    【解决方案2】:

    如果您只想将 DataGridCheckBoxColumn 设为只读,则应将样式添加到 DataGridCheckBoxColumn。

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

    【讨论】:

    • 我不知道你是否明白我想要做什么,所以我会向你解释我会根据属性更改IsReadOnly 属性的值(noCheckPermission)在尝试使用IsReadOnly="{Binding noCheckPermission}" 后,从我的 ViewModel 中得知这不起作用,所以我再次尝试,但现在使用触发器
    • 哦,好建议,我将在周二进行测试,但我相信它会同时起作用 +1
    • 好吧,可惜它不起作用,我什至无法窥探 IsReadOnly 值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 2013-03-29
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多