2013-09-30 3 views
1

Я пытаюсь создать настраиваемый элемент управления, который в основном является текстовым полем, расположенным над заголовком столбца datagrid, и отображает общее число в столбце datagrid. Библиотека управления состоит из двух настраиваемых элементов управления: DataGridColumnTotal содержит текстовое поле, которое также содержит ссылки на DataGrid и ItemsSource. Другой называется DataGridHeaderTotalControl, который в основном представляет собой стиль, предназначенный для DataGridColumnHeader. Этот стиль помещает элемент управления DataGridColumnTotal выше существующего DatagridColumnHeader и связывает поля DataGrid и DataGridItemsSource из элемента управления DataGridColumnTotal с полями Datagrid и ItemsSource.свойство зависимостей в пользовательском контроле не обновляется

В настоящее время я пытаюсь получить TextBox, чтобы показать, установлено ли свойство зависимостей IsTotalVisible, но он не будет обновляться, когда я попытаюсь установить его в MainWindow.xaml. У меня нет кода, который отображает общее значение, потому что я еще не получил этого.

Проблема возникает в MainWindow.xaml при попытке установить ctl: DataGridColumnTotal.IsTotalVisible = "True" в столбце dataGridText. Свойство IsTotalVisible не получает значение true. Но когда я устанавливаю значение по умолчанию для свойства dependency равным true, будут показаны полные текстовые поля.

DataGridColumnTotal.cs

//////////////////////////////////////////////////////////////////// 
//DataGridColumnTotal.cs 
//////////////////////////////////////////////////////////////////// 
using System; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Collections; 

namespace RiskControlLibrary 
{ 
    public class DataGridColumnTotal : Control 
    { 
     static DataGridColumnTotal() 
     { 
      DefaultStyleKeyProperty.OverrideMetadata(typeof(DataGridColumnTotal), new FrameworkPropertyMetadata(typeof(DataGridColumnTotal))); 
     } 

     public static bool GetIsTotalVisible(
      DependencyObject target) 
     { 
      return (bool)target.GetValue(IsTotalVisibleProperty); 
     } 

     public static void SetIsTotalVisible(
      DependencyObject target, bool value) 
     { 
      target.SetValue(IsTotalVisibleProperty, value); 
     } 

     public static DependencyProperty IsTotalVisibleProperty = 
     DependencyProperty.RegisterAttached("IsTotalVisible", typeof(bool), typeof(DataGridColumnTotal), 
     new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.Inherits)); 

    } 

    [ValueConversion(typeof(bool), typeof(Visibility))] 
    public class BoolToVisibilityConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      if ((bool)value) 
       return Visibility.Visible; 
      else 
       return Visibility.Collapsed; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new Exception("Not Implemented."); 
     } 
    } 
} 

DataGridHeaderTotalControl.cs

//////////////////////////////////////////////////////////////////// 
//DataGridHeaderTotalControl.cs 
//////////////////////////////////////////////////////////////////// 
using System.Windows; 
using System.Windows.Controls; 

namespace RiskControlLibrary 
{ 
    public class DataGridHeaderTotalControl : Control 
    { 
     static DataGridHeaderTotalControl() 
     { 
      DefaultStyleKeyProperty.OverrideMetadata(typeof(DataGridHeaderTotalControl), new FrameworkPropertyMetadata(typeof(DataGridHeaderTotalControl))); 
     } 
    } 
} 

Generic.xaml

//////////////////////////////////////////////////////////////////// 
//Generic.xaml 
//////////////////////////////////////////////////////////////////// 
<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:RiskControlLibrary" 
    xmlns:theme="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" 
    xmlns:s="clr-namespace:System;assembly=mscorlib"> 

    <Style TargetType="{x:Type local:DataGridColumnTotal}"> 
     <Style.Resources> 
      <local:BoolToVisibilityConverter x:Key="booleanToVisibilityConverter" /> 
     </Style.Resources> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:DataGridColumnTotal}"> 
        <Border Background="{TemplateBinding Background}" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}"> 
         <TextBox 
          x:Name="PART_TextBoxTotal" 
          IsReadOnly="True" 
          VerticalAlignment="Top" 
          VerticalContentAlignment="Center" 
          Text="{Binding Total, 
           RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:DataGridColumnTotal}}}" 
          Visibility="{Binding IsTotalVisible, RelativeSource={RelativeSource TemplatedParent}, 
          Converter={StaticResource booleanToVisibilityConverter}}" 
         > 
         </TextBox> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

    <Style TargetType="{x:Type DataGridColumnHeader}" 
      x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type local:DataGridHeaderTotalControl}, 
      ResourceId=DataGridHeaderTotalControlStyle}"> 
     <Setter Property="Template"> 

      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type DataGridColumnHeader}"> 

        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition /> 
         </Grid.ColumnDefinitions> 
         <Grid.RowDefinitions> 
          <RowDefinition /> 
          <RowDefinition /> 
         </Grid.RowDefinitions> 

         <local:DataGridColumnTotal Margin="1" Grid.Column="0" Grid.Row="0"/> 

          <theme:DataGridHeaderBorder Grid.Column="0" Grid.Row="1" SortDirection="{TemplateBinding SortDirection}" 
            IsHovered="{TemplateBinding IsMouseOver}" 
            IsPressed="{TemplateBinding IsPressed}" 
            IsClickable="{TemplateBinding CanUserSort}" 
            Background="{TemplateBinding Background}" 
            BorderBrush="{TemplateBinding BorderBrush}" 
            BorderThickness="{TemplateBinding BorderThickness}" 
            Padding ="{TemplateBinding Padding}" 
            SeparatorVisibility="{TemplateBinding SeparatorVisibility}" 
            SeparatorBrush="{TemplateBinding SeparatorBrush}"> 

          <TextBlock Grid.Column="0" Grid.Row="1" Text="{TemplateBinding Content}" 
            SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
            VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
            HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
             TextWrapping="Wrap"></TextBlock> 

         </theme:DataGridHeaderBorder> 

        </Grid> 

       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

MainWindow.xaml

//////////////////////////////////////////////////////////////////// 
//MainWindow.xaml 
//////////////////////////////////////////////////////////////////// 
<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:app="clr-namespace:WpfApplication1" 
     xmlns:ctl="clr-namespace:RiskControlLibrary;assembly=RiskControlLibrary" 
     Title="MainWindow" Height="341" Width="452" 
     Loaded="Window_Loaded"> 
    <Grid> 
     <DataGrid 
      Name="m_dgOrder" 
      ItemsSource="{Binding ListPos}" 
      GridLinesVisibility="None" 
      AutoGenerateColumns="False" 
      IsReadOnly="True" 
      Background="White" 
      CanUserResizeRows="False" 
      HeadersVisibility="Column" 
      RowHeaderWidth="0" 
      ColumnHeaderStyle="{StaticResource {ComponentResourceKey 
      TypeInTargetAssembly={x:Type ctl:DataGridHeaderTotalControl}, 
      ResourceId=DataGridHeaderTotalControlStyle}}"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Symbol" Binding="{Binding Path=Symbol}"/> 
       <DataGridTextColumn Header="Pos" Binding="{Binding Path=Pos}" ctl:DataGridColumnTotal.IsTotalVisible="True"/> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</Window> 
+1

К большому коду, чтобы посмотреть корыто, но из того, что я вижу, вы пытаетесь использовать свойство зависимости как прикрепленное свойство, это предназначено? Я думаю, что вы ищете унаследованные приложенные свойства. – dowhilefor

+0

Я не уверен, что он должен быть прикреплен. Я попытался использовать RegisterAttached, но это тоже не сработало. Нужно ли быть прикрепленным имуществом, основанным на том, как оно установлено в MainWindow.xaml? – Alex

+1

Из того, что я вижу, является то, что у вас есть DataGridTextColumn, и вы устанавливаете ctl: DataGridColumnTotal.IsTotalVisible = "True", который явно является синтаксисом для прикрепленного свойства. Но собственность не привязана. Кроме того, он не наследуется, поэтому любой дочерний класс DataGridColumnTotal не может использовать свойство, которое, я думаю, является тем, что вы хотите. Поэтому сделайте это Attached и дайте ему FrameworkPropertyMetadataOptions.Inherits вместо None. И посмотрим, работает ли это. Вам также может потребоваться настроить привязки для прикрепленного свойства. – dowhilefor

ответ

0

Я регистрировал свойство IsTotalVisible в неправильном классе. Вместо DataGridColumnTotal это должен был DataGridTextColumn.

Смежные вопросы