首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataGridTextColumn -如何绑定IsReadonly?

DataGridTextColumn -如何绑定IsReadonly?
EN

Stack Overflow用户
提问于 2011-05-08 10:20:45
回答 1查看 8.4K关注 0票数 5

在Silverlight 4中,DataGridTextColumn的DataGridTextColumn属性似乎不是依赖项属性。因此,我无法将其绑定到视图模型上的属性。

似乎唯一的选择是使用DataTemplate,但即使在这里,我也面临两个主要问题:

代码语言:javascript
复制
<sdk:DataGrid Style="{StaticResource DataGridStyle}" x:Name="call_dataGrid" ItemsSource="{Binding Calls}">
                    <sdk:DataGrid.Columns>
                        <sdk:DataGridTextColumn Header="Call Time" Binding="{Binding Path=CallTime}" />
                        <sdk:DataGridTemplateColumn Header="Call Date">
                            <sdk:DataGridTemplateColumn.CellEditingTemplate>
                                <DataTemplate>
                                    <TextBox Text="{Binding Path=CallDate}" IsReadOnly="{Binding Path=DataContext.IsInEditMode, ElementName=call_dataGrid, Converter={StaticResource NegationConverter}}"/>
                                </DataTemplate>
                            </sdk:DataGridTemplateColumn.CellEditingTemplate>
                        </sdk:DataGridTemplateColumn>

我似乎无法编辑DataGridTextColumn的模板,而不得不使用DataGridTemplateColumn代替上面所示的模板。然而,这会覆盖我以前在DataGridStyle中定义的所有样式。我的列甚至没有行标记,与其他单元格看起来完全不同。

第二个问题是,它仍然不能正常工作。该模板中的文本框仍未设置为只读。我在这里做错了什么?

非常感谢你在这方面的帮助,

更新

在下面的有希望的回应之后,我调整了代码,但没有成功。

我已将DP的回调更改为

代码语言:javascript
复制
public class IsReadOnlyDpAttachable
    {
        public static void SetIsReadXOnly(DependencyObject obj, bool isReadOnly)
        {
            obj.SetValue(IsReadXOnlyProperty, isReadOnly);
        }

        public static bool GetIsReadXOnly(DependencyObject obj)
        {
            return (bool)obj.GetValue(IsReadXOnlyProperty);
        }

        public static readonly DependencyProperty IsReadXOnlyProperty =
            DependencyProperty.RegisterAttached("IsReadXOnly", typeof(bool), typeof(IsReadOnlyDpAttachable), new PropertyMetadata(false, Callback));

        private static void Callback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            ((DataGrid)d).IsReadOnly = (bool)e.NewValue;
        }
    }

并且在DataGrid的IsReadOnly本身上设置DP,它运行得非常好,但是在这里我还是不需要它,因为这里的IsReadOnly已经是一个Dp,而且无论如何都可以轻松绑定。但测试表明,Dp运行良好:

代码语言:javascript
复制
<sdk:DataGrid PrismExt:IsReadOnlyDpAttachable.IsReadXOnly="{Binding IsInEditMode, Mode=TwoWay, Converter={StaticResource NegationConverter}}" Style="{StaticResource DataGridStyle}" CanUserReorderColumns="True" x:Name="call_dataGrid" AutoGenerateColumns="False" ItemsSource="{Binding Calls}">

然而,当我试图在底层DataGridTextColumn上使用DP时,它没有做任何事情:

代码语言:javascript
复制
<Grid x:Name="LayoutRoot">
<sdk:DataGrid Style="{StaticResource DataGridStyle}" CanUserReorderColumns="True" x:Name="call_dataGrid" AutoGenerateColumns="False" ItemsSource="{Binding Calls}">
                    <sdk:DataGrid.Columns>                        
                        <sdk:DataGridTextColumn Header="Call Time" Binding="{Binding Path=CallTime}" PrismExt:IsReadOnlyDpAttachable.IsReadXOnly="{Binding DataContext.IsInEditMode, ElementName=LayoutRoot, Mode=TwoWay, Converter={StaticResource NegationConverter}}"/>
                    </sdk:DataGrid.Columns>
</sdk:DataGrid>
</Grid>

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-08 14:15:28

您可以做的是创建一个附加属性来处理IsReadOnly属性在DataGridTextColumn中的更改。

代码语言:javascript
复制
public class Class1
{
    public static void SetIsReadOnly(DependencyObject obj, bool isReadOnly)
    {
        obj.SetValue(IsReadOnlyProperty, isReadOnly);
    }

    public static bool GetIsReadOnly(DependencyObject obj)
    {
        return (bool)obj.GetValue(IsReadOnlyProperty);
    }

    // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty IsReadOnlyProperty =
        DependencyProperty.RegisterAttached("IsReadOnly", typeof(bool), typeof(Class1), new PropertyMetadata(false, Callback));

    private static void Callback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((DataGridTextColumn)d).IsReadOnly = (bool)e.NewValue;
    }
}

在xaml中,只需使用附加属性即可。

代码语言:javascript
复制
<sdk:DataGridTextColumn local:Class1.IsReadOnly="True" Binding="{Binding Property1}" Header="Property1"/>

希望这能有所帮助。:)

更新

一旦您拥有了DataContextProxy类,就可以了

代码语言:javascript
复制
        <sdk:DataGridTextColumn Binding="{Binding Name}"
                                local:Class1.IsReadOnly="{Binding DataSource.IsInEditMode, Source={StaticResource DataContextProxy}, Converter={StaticResource xxxConverter}}"
                                Header="ReadOnly Header" />
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5926849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档