1

WPFのデータグリッドに奇妙な問題があります。アプリケーションにMVVMパターンを使用しており、ビューモデルはidataerrorinfoインターフェイスを実装しています。新しい行を追加した後、データグリッドを上下にスクロールすると、すべてのセルが乱雑になり、データグリッド全体がフリーズします。idataerrorinfoインターフェースの実装を削除すると正常に動作します。誰かが同じ問題を抱えていますか?

。どんな助けもいただければ幸いです...

更新:奇妙な動作は、dataGridに新しい行を追加した後にのみ発生します。既存の行を変更して上下にスクロールしても問題はありません。観察可能なコレクションに新しいビューモデルを追加しているときに何かが発生しました。何がわからない。助けが要る..

更新: これはプロジェクトXAMLの小さなバージョンです

<Window x:Class="testWPF.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>

    <!-- style to apply to DataGridTextColumn in edit mode  -->
    <Style x:Key="CellEditStyle" TargetType="{x:Type TextBox}">
        <Setter Property="BorderThickness" Value="0"/>
        <Setter Property="Padding" Value="0"/>
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="ToolTip"
                        Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
            </Trigger>
        </Style.Triggers>
    </Style>

    <!-- A Row Style which renders a different validation error indicator -->
    <Style x:Key="RowStyle" TargetType="{x:Type dg:DataGridRow}">
        <Setter Property="ValidationErrorTemplate">
            <Setter.Value>
                <ControlTemplate>
                    <Grid>
                        <Ellipse Width="12" Height="12" Fill="Red" Stroke="Black" StrokeThickness="0.5"/>
                        <TextBlock FontWeight="Bold" Padding="4,0,0,0" Margin="0" VerticalAlignment="Top" Foreground="White" Text="!"
                                   ToolTip="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type dg:DataGridRow}},
                                                     Path=(Validation.Errors)[0].ErrorContent}"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

<!-- a simple details view which is synchronised with the selected item in the data grid -->

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="265*" />
        <RowDefinition Height="46*" />
    </Grid.RowDefinitions>
    <DataGrid Name="dataGrid" AutoGenerateColumns="False" IsSynchronizedWithCurrentItem="True"
              ItemsSource="{Binding GetPeople}" Height="204" Margin="0,54,0,8">
        <!--<dg:DataGrid.RowValidationRules>
            <local:RowDummyValidation/>
        </dg:DataGrid.RowValidationRules>-->
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" EditingElementStyle="{StaticResource CellEditStyle}"
                                Binding="{Binding Path=Name, ValidatesOnDataErrors=True,UpdateSourceTrigger=PropertyChanged}"/>
            <DataGridTextColumn Header="Age" EditingElementStyle="{StaticResource CellEditStyle}"
                                Binding="{Binding Path=Age, ValidatesOnExceptions=True}"/>
        </DataGrid.Columns>
    </DataGrid>
    <Button Content="Button" Command="{Binding AddNewConfigProperty}"
            Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="194,11,0,0"
            Name="button1" VerticalAlignment="Top" Width="75" />
</Grid>

Person ListViewModel

namespace testWPF
{
    class PersonListViewModel: ViewModelBase
    {
        private ObservableCollection<Person> personCollection;

        //private PartNumbersEntities dbCOntext = new PartNumbersEntities();
        public ObservableCollection<Person> GetPeople
        {
            get
            {
                if (personCollection == null)
                {
                    personCollection = new ObservableCollection<Person>();
                    for(int i= 0; i<100;i++)
                    {
                        personCollection.Add(new Person()
                        {
                            Name = "Frank Grimmes",
                            Age = 25,
                            DateOfBirth = new DateTime(1975, 2, 19)
                        });
                    }
                }                  
                return personCollection;
            }             
        }

        public ICommand AddNewConfigProperty { get { return new RelayCommand(AddNewConfigPropertyExecute, CanAddNewConfigPropertyExecute); } }

        bool CanAddNewConfigPropertyExecute()
        {
            return true;
        }

        void AddNewConfigPropertyExecute()
        {
            personCollection.Add(new Person()
                    {
                        Name = "Some Name",
                        Age = 25,
                        DateOfBirth = new DateTime(1924, 9, 1)
                    });
            OnPropertyChanged("GetPeople");
        }  
    }
}

人のクラス

namespace testWPF
{
    public class Person : ViewModelBase, IDataErrorInfo
    {
        //private readonly Regex nameEx = new Regex(@"^[A-Za-z ]+$");

        private string name;

        public string Name
        {
            get { return name; }
            set
            { 
                name = value;
            }
        }

        private int age;

        public int Age
        {
            get { return age; }
            set
            {
                age = value;
            }
        }

        public DateTime DateOfBirth { get; set; }

        public string Error
        {
            get { return ""; }
        }

        public string this[string columnName]
        {
            get
            {
                string result = null;
                if (columnName == "Name")
                {
                    if (string.IsNullOrEmpty(Name))
                        result = "Please enter a name";
                }
                return result;
            }
        } 
    } 
}
4

1 に答える 1

0

IDataErrorInfo this[string columnName] Getter で時間のかかる IO 操作を行わないでください。作る

System.IO.File.AppendAllText("C:\\temp\\log.txt", "PartConfigName: " + PartConfigName + "\r\n");

非同期またはdebug modus の条件付き [Conditional("DEBUG")]

于 2012-04-10T08:28:38.277 に答える