2017-04-12 59 views
2

我遇到以下问题,我不知道我的错在哪里。 我用DataGridComboBoxColumn指定了一个DataGrid,并设置了一个简单的ElementStyle,它应该为非编辑模板的文本着色。着色起作用,但文本值本身始终是最后编辑的值。设置DataGridComboBoxColumn的ElementStyle打破预期行为

查看image的错误行为。红色文本应该与左侧相同。由于对象是相同的(请参阅GUID)。

我试着将基础样式设置为{x:Static DataGridComboBoxColumn.TextBlockComboBoxStyleKey}并尝试将TargetType设置为DataGridComboBoxColumn + TextBlockComboBox(通过反射)。没有改变任何东西。

我注意到通过Live属性资源管理器DataGridComboBoxColumn + TextBlockComboBox的SelectedItem为左侧网格计算,但不是为右侧网格计算。所以我的假设是设置风格时绑定​​会中断。

这是WPF DataGrid的已知问题吗?有没有办法解决这个问题,而不使用DataGridTemplateColumn?

要复制我附加的源代码的问题。

MainWindow.xaml

<Window x:Class="DataGridComboBoxStyleError.MainWindow" 
     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:local="clr-namespace:DataGridComboBoxStyleError" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="200" Width="750" WindowStartupLocation="CenterScreen"> 
    <Window.Resources> 
     <CollectionViewSource x:Key="_availableCultures" Source="{Binding Source={x:Static local:MainWindow.AvailableCultures}}" /> 

     <x:Array x:Key="Items" Type="{x:Type local:TestItem}"> 
      <local:TestItem CultureName="de" /> 
      <local:TestItem CultureName="en" /> 
      <local:TestItem CultureName="ru" /> 
     </x:Array> 

     <Style x:Key="_comboBoxStyle" x:Shared="False" TargetType="{x:Type ComboBox}"> 
      <Setter Property="Foreground" Value="Red" /> 
     </Style> 

    </Window.Resources> 
    <StackPanel> 
     <Grid x:Name="_mainGrid"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*" /> 
       <ColumnDefinition Width="*" /> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="auto" /> 
       <RowDefinition Height="auto" /> 
       <RowDefinition Height="auto" /> 
       <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 
      <TextBlock Grid.Row="0" Grid.ColumnSpan="2" Text="ItemsSource via StaticResource" HorizontalAlignment="Center" /> 
      <TextBlock Grid.Row="1" Grid.Column="0" Text="Default ElementStyle" HorizontalAlignment="Center" /> 
      <TextBlock Grid.Row="1" Grid.Column="1" Text="Specified ElementStyle" HorizontalAlignment="Center" /> 
      <DataGrid Grid.Row="2" Grid.Column="0" ItemsSource="{StaticResource Items}" CanUserAddRows="False" AutoGenerateColumns="False"> 
       <DataGrid.Columns> 
        <DataGridTextColumn Header="Id" Binding="{Binding Id}" /> 
        <DataGridComboBoxColumn ItemsSource="{Binding Source={StaticResource _availableCultures}}" SelectedItemBinding="{Binding Culture}" DisplayMemberPath="NativeName" Header="Culture" Width="*" /> 
       </DataGrid.Columns> 
      </DataGrid> 
      <DataGrid Grid.Row="2" Grid.Column="1" ItemsSource="{StaticResource Items}" CanUserAddRows="False" AutoGenerateColumns="False"> 
       <DataGrid.Columns> 
        <DataGridTextColumn Header="Id" Binding="{Binding Id}" /> 
        <DataGridComboBoxColumn ItemsSource="{Binding Source={StaticResource _availableCultures}}" SelectedItemBinding="{Binding Culture}" DisplayMemberPath="NativeName" Header="Culture" Width="*" ElementStyle="{StaticResource _comboBoxStyle}" /> 
       </DataGrid.Columns> 
      </DataGrid> 
     </Grid> 
    </StackPanel> 
</Window> 

MainWindow.xaml.cs

namespace DataGridComboBoxStyleError 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     public static IEnumerable<CultureInfo> AvailableCultures = CultureInfo.GetCultures(CultureTypes.AllCultures); 
    } 
} 

TestItem.cs

public class TestItem 
{ 
    public CultureInfo Culture { get; set; } 

    public string CultureName 
    { 
     get { 
      return Culture.TwoLetterISOLanguageName; 
     } 
     set { 
      Culture = CultureInfo.GetCultureInfo(value); 
     } 
    } 

    public string Id { get; } = Guid.NewGuid().ToString(); 
} 

回答

0

有什么办法来解决THI而不使用DataGridTemplateColumn?

您可以设置的CellStyle而不是设置ElementStyle

<DataGridComboBoxColumn ItemsSource="{Binding Source={StaticResource _availableCultures}}" SelectedItemBinding="{Binding Culture}" DisplayMemberPath="NativeName" Header="Culture" Width="*"> 
    <DataGridComboBoxColumn.CellStyle> 
     <Style TargetType="{x:Type DataGridCell}"> 
      <Setter Property="Foreground" Value="Red" /> 
     </Style> 
    </DataGridComboBoxColumn.CellStyle> 
</DataGridComboBoxColumn> 
+0

谢谢,这似乎是简单的情况下,但对于指定'ContentTemplate'了'ComboBox'工作(例如前景。)? –

+0

当DataGridComboBoxColumn的功能因任何原因不适合您的需求时,请使用DataGridTemplateColumn。 – mm8

+0

请记住接受问题已解决的答案:https://meta.stackexchange.com/questions/23138/how-to-accept-the-answer-on-stack-overflow – mm8