Hou*_*man 5 silverlight silverlight-4.0
在Silverlight 4中,DataGridTextColumn的IsReadOnly属性似乎不是依赖属性.因此我无法将其绑定到viewmodel上的属性.
似乎唯一的选择是使用DataTemplate,但即使在这里我也面临两个主要问题:
<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>
Run Code Online (Sandbox Code Playgroud)
我似乎无法编辑DataGridTextColumn的模板,而是必须使用DataGridTemplateColumn,如上所示.但是这会覆盖我之前在DataGridStyle中定义的所有样式.我的专栏甚至没有行标记,看起来与其他细胞完全不同.
第二个问题是,它仍然没有按预期工作.该模板中的文本框仍未设置为只读.我在这做错了什么?
非常感谢您对此的帮助,
更新
在下面有希望的回应之后我调整了代码但没有成功.
我已将DP的回调更改为以下内容
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;
}
}
Run Code Online (Sandbox Code Playgroud)
并且在DataGrid的IsReadOnly本身上设置DP,它工作得非常好,但是在这里我再也不需要它,因为IsReadOnly在这里已经是Dp并且无论如何都可以轻松绑定.但测试显示Dp工作正常:
<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}">
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试在底层DataGridTextColumn上使用DP时,它不会执行任何操作:
<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>
Run Code Online (Sandbox Code Playgroud)
任何的想法?
你可以做的是创建一个附加属性来处理DataGridTextColumn中IsReadOnly属性的更改.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
在您的xaml中,您可以使用附加属性.
<sdk:DataGridTextColumn local:Class1.IsReadOnly="True" Binding="{Binding Property1}" Header="Property1"/>
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.:)
更新
有了DataContextProxy类,就可以了
<sdk:DataGridTextColumn Binding="{Binding Name}"
local:Class1.IsReadOnly="{Binding DataSource.IsInEditMode, Source={StaticResource DataContextProxy}, Converter={StaticResource xxxConverter}}"
Header="ReadOnly Header" />
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7793 次 |
| 最近记录: |