0

私は WPF データグリッドを持っていて、それを観察可能なコレクションにバインドしました。正常に動作していますが、実行時にセルレベルでスタイルを適用したことが問題です。以下に示すサンプル メソッド ApplyStyleAtCellLevelInDataGrid() があります。WPF DataGrid でスタイルの効果を表示するには、このメソッドを 2 回呼び出す必要があります。どうしてこんなに...

ここにXAMLがあります

 <Style x:Key="BaseStyle"  TargetType="{x:Type TextBlock}">
     <Setter Property="Background" Value="Transparent"/>
     <Setter Property="Foreground" Value="Black"/>        
     <Setter Property="FontSize" Value="10"/>
     <Setter Property="TextAlignment" Value="Center"/>
 </Style>

<Style TargetType="{x:Type TextBlock}" x:Key="Col1Style" BasedOn="{StaticResource BaseStyle}">

        <Setter Property="Background">
            <Setter.Value>
                <SolidColorBrush Color="Tomato"/>
            </Setter.Value>
        </Setter>            

        <Style.Triggers>
            <EventTrigger RoutedEvent="Binding.TargetUpdated">
                <BeginStoryboard HandoffBehavior="Compose">
                    <Storyboard TargetProperty="(TextBlock.Background).(SolidColorBrush.Color)">
                    <ColorAnimation Duration="0:0:1.5" To="DarkRed"  AutoReverse="True" RepeatBehavior="1" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Style.Triggers>
    </Style>

< Style x:Key="DGCellStyle" TargetType="{x:Type DataGridCell}">

        <Setter Property="BorderThickness" Value="0" />
        <Setter Property="FontSize" Value="10"></Setter>
        <Setter Property="Foreground" Value="Black"></Setter>           
    </Style>

XAML でのグリッド宣言

<DataGrid Name="dataGrid1"  ItemsSource="{Binding Values}" CellStyle="{StaticResource DGCellStyle}" SnapsToDevicePixels="True" UseLayoutRounding="False">

  <DataGrid.Columns>
      <DataGridTextColumn  Header="Value" Binding="{Binding Value1, Mode=OneWay, NotifyOnTargetUpdated=True}" Width="0.25*"/>
      <DataGridTextColumn Header="Value 1" Binding="{Binding Value2, Mode=OneWay, NotifyOnTargetUpdated=True}" Width="0.25*"/>
      <DataGridTextColumn Header="Value 2" Binding="{Binding Value3, Mode=OneWay, NotifyOnTargetUpdated=True}" Width="0.25*"/>
      <DataGridTextColumn Header="Value 3" Binding="{Binding Value4, Mode=OneWay, NotifyOnTargetUpdated=True}" Width="0.25*"/>
   </DataGrid.Columns>           
 </DataGrid>

コード

 private void ApplyStyleAtCellLevelInDataGrid()

    {
        if (Values == null || Values.Count == 0)
        {
            Values = new ObservableCollection<MyClass>();
            Values.Add(new MyClass { Value1 = "1", Value4 = "2", Value2 = "4", Value3 = "3" });
            Values.Add(new MyClass { Value1 = "2", Value4 = "3", Value2 = "5", Value3 = "7" });
            Values.Add(new MyClass { Value1 = "3", Value4 = "4", Value2 = "7", Value3 = "2" });
            Values.Add(new MyClass { Value1 = "4", Value4 = "4", Value2 = "8", Value3 = "6" });
        }
        else
        {
            foreach (var item in Values)
            {
                MyClass c = item as MyClass;
                c.Value1 = _rand.Next(0, 100).ToString();         
                c.Value2 = _rand.Next(0, 100).ToString();
                c.Value3 = _rand.Next(0, 100).ToString();
                c.Value4 = _rand.Next(0, 100).ToString();
            }
        }

        //////////////

        DataGridCell cell = GetCell(1, 1);

        Style defaultStyle = (Style)FindResource("NewStyle");
        ((TextBlock)cell.Content).Style = defaultStyle;

        cell = GetCell(1, 2);
        defaultStyle = (Style)FindResource("NewStyleExtended");
        ((TextBlock)cell.Content).Style = defaultStyle;

        cell = GetCell(2, 2);
        defaultStyle = (Style)FindResource("NewStyle");
        ((TextBlock)cell.Content).Style = defaultStyle;

        cell = GetCell(2, 3);
        defaultStyle = (Style)FindResource("Col1Style");
        ((TextBlock)cell.Content).Style = defaultStyle;
    }


 private void Window_Loaded(object sender, RoutedEventArgs e)
    {         
// Single call of this method does not work,

I have to call two times then it shows the effect

        ApplyStyleAtCellLevelInDataGrid(); 
        ApplyStyleAtCellLevelInDataGrid();
    }
4

3 に答える 3

0

TargetTypeスタイルを a から aTextBlockに変更DataGridCellし、スタイルを として適用しますDataGrid.CellStyleCellStyleへのセットがすでにあるので、DGCellStyleおそらく 2 つのスタイルをマージする必要があります。

また、 はのプロパティではないため、基本スタイルを に変更TextAlignmentする必要があります。HorizontalAlignmentTextAlignmentDataGridCell

<Style x:Key="BaseStyle"  TargetType="{x:Type DataGridCell}">
     <Setter Property="Background" Value="Transparent"/>
     <Setter Property="Foreground" Value="Black"/>        
     <Setter Property="FontSize" Value="10"/>
     <Setter Property="HorizontalAlignment" Value="Center"/>
 </Style>

<Style TargetType="{x:Type DataGridCell}" x:Key="Col1Style" BasedOn="{StaticResource BaseStyle}">
    <Setter Property="Background">
        <Setter.Value>
            <SolidColorBrush Color="Tomato"/>
        </Setter.Value>
    </Setter>            

    <Style.Triggers>
        <EventTrigger RoutedEvent="Binding.TargetUpdated">
            <BeginStoryboard HandoffBehavior="Compose">
                <Storyboard TargetProperty="(DataGridCell.Background).(SolidColorBrush.Color)">
                <ColorAnimation Duration="0:0:1.5" To="DarkRed"  AutoReverse="True" RepeatBehavior="1" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Style.Triggers>
</Style>

<DataGrid CellStyle="{StaticResource Col1Style}" ... />
于 2012-11-06T15:12:58.850 に答える
0

DataTemplateSelector の実装に興味があるかもしれません。このオブジェクトは、任意のデータ項目に表示ロジックを提供するために使用されます。

ここに簡単なチュートリアルがあります: http://www.switchonthecode.com/tutorials/wpf-tutorial-how-to-use-a-datatemplateselector

于 2012-11-06T15:20:13.337 に答える
0

App.xaml に追加

"xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit"アプリケーションタグで。

<Application.Resources>タグ追加で

<Style x:Key="ColumnHeaderStyle" TargetType="{x:Type dg:DataGridColumnHeader}">
    <Setter Property="HorizontalAlignment" Value="Center" />
</Style>

<Style x:Key="CellRightAlign" TargetType="{x:Type dg:DataGridCell}">
    <Setter Property="HorizontalAlignment" Value="Right" />
</Style>

AutoGeneratedColumnsデータグリッドにイベントを追加するコードビハインドになりました

Style RightAlign = (Style)FindResource("CellRightAlign");
yourGrid.Columns[0].CellStyle = RightAlign;
于 2013-01-31T11:07:42.893 に答える