簡體   English   中英

自定義控件中的依賴項屬性未更新

[英]dependency property in custom control not updating

我試圖做一個自定義控件,它基本上是一個位於Datagrid列標題上方的TextBox,並在datagrid列中顯示總數。 控件庫由兩個自定義控件組成:DataGridColumnTotal包含文本框,該文本框還包含對DataGrid和ItemsSource的引用。 另一個稱為DataGridHeaderTotalControl,它基本上是一種針對DataGridColumnHeader的樣式。 這種樣式將DataGridColumnTotal控件放置在現有DatagridColumnHeader的上方,並將DataGridColumnTotal控件的DataGrid和DataGridItemsSource字段綁定到Datagrid和ItemsSource字段。

我目前正試圖獲取TextBox以顯示是否設置了IsTotalVisible依賴項屬性,但是當我嘗試在MainWindow.xaml中進行設置時,它不會更新。 我沒有任何顯示總價值的代碼,因為我還沒有走那么遠。

嘗試在dataGridText列中設置ctl:DataGridColumnTotal.IsTotalVisible =“ True”時,在MainWindow.xaml中會出現問題。 IsTotalVisible屬性未設置為true。 但是,當我將依賴項屬性的默認值設置為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
////////////////////////////////////////////////////////////////////
<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>

我正在將IsTotalVisible屬性注冊到錯誤的類。 而不是DataGridColumnTotal,應該是DataGridTextColumn。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM