【问题标题】:WPF Binding external styles with no XAML tagWPF 绑定没有 XAML 标记的外部样式
【发布时间】:2017-10-02 04:07:40
【问题描述】:

如果我有一个如下所示的 WPF DataGrid:

<DataGrid x:Name="DataGridQ" AutoGenerateColumns="False" Grid.ColumnSpan="2">
    <DataGrid.Resources>
        <Style TargetType="{x:Type DataGridRow}">
             <Setter Property="Background" Value="#3f3f3f" />                                   
        </Style> 
    </DataGrid.Resources>   

    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
        <DataGridTextColumn Header="Name2" Binding="{Binding Name2}"/>
    </DataGrid.Columns>
</DataGrid>

如果我想从外部样式表设置 DataGrid 的样式并将样式绑定到网格,我会这样编写样式:

<Style TargetType="{x:Type DataGrid}" x:Key="DataGridstyle">
     <Setter Property="BorderBrush" Value="#FF636363" />       
</Style>

并像这样绑定它:

<DataGrid {StaticResource DataGridstyle}" />

这很好,但如果我想绑定到 DataGrid 的行,我实际上在上述 XAML 中没有标签来创建绑定,因此必须在网格内的 &lt;DataGrid.Resources&gt; 中执行样式。尽管 DataGrid 行没有 XAML 标记,是否可以创建与外部样式资源的绑定?

编辑:我要做什么的想法:

 <DataGridRow {StaticResource DataGridRowstyle}" />

但这是不可能的,因为行是从 DataGrid 列中的绑定创建的。所以我没有“数据网格行”标签可以将样式绑定附加到

【问题讨论】:

  • 用一些示例代码/标记来解释你想要实现什么?

标签: c# .net wpf xaml datagrid


【解决方案1】:

试试这个:

    <Window x:Class="WpfApp10.Window3"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:local="clr-namespace:WpfApp10"
        mc:Ignorable="d"
        Title="Window3" Height="300" Width="300">
    <Window.Resources>

        <x:Array x:Key="array1" Type="{x:Type sys:String}">
            <sys:String>Row 1</sys:String>
            <sys:String>Row 2</sys:String>
            <sys:String>Row 3</sys:String>
        </x:Array>

        <Style x:Key="DataGridRowStyle1" TargetType="{x:Type DataGridRow}">
            <Setter Property="Background" Value="#3f3f3f" />
            <Setter Property="Foreground" Value="White"/>
        </Style>

    </Window.Resources>

    <Grid>
        <DataGrid x:Name="DataGridQ" 
                  ItemsSource="{StaticResource array1}" 
                  RowStyle="{StaticResource DataGridRowStyle1}"
                  AutoGenerateColumns="False">

            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding}"/>
                <DataGridTextColumn Header="Name2" Binding="{Binding}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

【讨论】:

    【解决方案2】:

    你可以使用MergedDictionaries:

    <Grid.Resources>
      <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
          <ResourceDictionary Source="MyResourceDictionary.xaml"/>
        </ResourceDictionary.MergedDictionaries>
        ... <Some other resources> ...
      </ResourceDictionary>
    </Grid.Resources>
    

    MyResourceDictionary 可能如下所示:

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
      <Style TargetType="..." BasedOn="...">
       ...
      </Style>
       ...
    </ResourceDictionary>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多