2011-06-01 67 views
0

我的问题似乎很简单,但我解决不了,我已经花了一天就可以了...在DataGrid.ElementStyle绑定一个DependencyProperty为每列

我有一个DataGrid,我想成为能够在每列上启用/禁用TextWrapping。 Wrapping可以使用控制器的DependencyProperty。

看起来我的绑定路径并不好,因为“datacontext”。

什么是良好的绑定路径?

下面是代码的提取物:

的的DependencyProperty在控制器:

public class ControlerDataConsult : DependencyObject 
{ 
    public static readonly DependencyProperty SelectDataList_Column0IsWrappingProperty = DependencyProperty.Register("SelectDataList_Column0IsWrapping", typeof(TextWrapping), typeof(ControlerDataConsult), new UIPropertyMetadata(TextWrapping.NoWrap)); 
} 

的 “ControlerDataConsult” 用作DataContext的用于XAML页。

DataGrid中的Xaml。

<dg:DataGrid CanUserSortColumns="False" IsReadOnly="True" Name="SelectedList" SelectionMode="Extended" SelectionChanged="SelectedList_SelectionChanged" 
     HeadersVisibility="Column" Margin="5,14,5,-4" GridLinesVisibility="all" AutoGenerateColumns="False" ItemsSource="{Binding Path=SelectDataList}" 
     BorderThickness="1" BorderBrush="{DynamicResource clBLACK}" Loaded="SelectedList_Loaded" > 
     <dg:DataGrid.Columns> 
      <dg:DataGridTextColumn Width="50" Header="" HeaderStyle="{StaticResource DataGridHeaderStyle}" Binding="{Binding Index}"/> 
       <dg:DataGridTextColumn Visibility="{Binding (FrameworkElement.DataContext).SelectDataList_Column0IsVisible, RelativeSource={x:Static RelativeSource.Self},Converter={StaticResource VisibilityConverter}}" 
        Header="{Binding (FrameworkElement.DataContext).SelectDataList_Column0Title, RelativeSource={x:Static RelativeSource.Self}}" 
        HeaderStyle="{StaticResource DataGridHeaderStyle}" Binding="{Binding Col0}"> 
        <dg:DataGridTextColumn.ElementStyle> 
          <Style TargetType="TextBlock"> 
           <Setter Property="TextWrapping" Value="{Binding (FrameworkElement.DataContext).SelectDataList_Column0IsWrapping, RelativeSource={x:Static RelativeSource.Self}}" /> 
          </Style> 
        </dg:DataGridTextColumn.ElementStyle> 
       </dg:DataGridTextColumn> 
     </dg:DataGrid.Columns> 
</dg:DataGrid> 

如果我试试这个:<Setter Property="TextWrapping" Value="True" />它按预期工作。

我尝试了几个绑定,可以得到好的。

在运行时,我得到了这个错误:

BindingExpression path error: 'SelectDataList_Column0IsWrapping' property not found on 'object' ''DataRowView' (HashCode=4892154)'. BindingExpression:Path=(FrameworkElement.DataContext).SelectDataList_Column0IsWrapping; DataItem='TextBlock' (Name=''); target element is 'TextBlock' (Name=''); target property is 'TextWrapping' (type 'TextWrapping')

如果您有任何想你救了我:)

感谢,

+0

该属性所属的类在哪里以及它出现在datagrid的对象模型/层次结构中? (由于它没有在XAML中的任何地方设置) – 2011-06-01 11:49:53

+0

请参阅编辑。希望它能回答你的问题。 – ykatchou 2011-06-01 12:08:36

回答

1

The "ControlerDataConsult" is used as DataContext for the XAML Page.

如果是这样的情况下,你可以尝试这样的相对源绑定:

{Binding RelativeSource={RelativeSource AncestorType=Page}, Path=DataContext.SelectDataList_Column0IsWrapping} 
+0

我太亲密了!我试过这个使用Path = .SelectDataList_Column0IsWrapping :(非常感谢! – ykatchou 2011-06-01 14:11:57

+0

太糟糕了,你浪费了这么多时间在这个相当简单的问题,很高兴帮助:) – 2011-06-01 14:18:24

+0

非常感谢帮助:) – ykatchou 2011-06-06 07:53:19