0

プロパティ グリッドに DateTime 型のプロパティがあります。コードは次のとおりです。

XAML

<xctk:PropertyGrid x:Name="_propertyGrid" Margin="10" AutoGenerateProperties="True" SelectedObject="{Binding}">

</xctk:PropertyGrid>

C#

public class DateEditor : Xceed.Wpf.Toolkit.PropertyGrid.Editors.ITypeEditor
    {
        public FrameworkElement ResolveEditor(Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem propertyItem)
        {

            DateTimeUpDown temp1 = new DateTimeUpDown();
            temp1.Format = DateTimeFormat.Custom;
            temp1.FormatString = "dd.MM.yyyy hh:m:ss";

            //create the binding from the bound property item to the editor
            var _binding = new Binding("Value"); //bind to the Value property of the PropertyItem
            _binding.Source = propertyItem;
            _binding.ValidatesOnExceptions = true;
            _binding.ValidatesOnDataErrors = true;
            _binding.Mode = BindingMode.TwoWay;

            BindingOperations.SetBinding(temp1, DateTimeUpDown.TextProperty, _binding);

            return temp1;
        }
    }

public class CustomAttributEditorPerson : INotifyPropertyChanged
    {
        private DateTime FDate;

        [Category("Information")]
        [DisplayName("Date")]
        //This custom editor is a Class that implements the ITypeEditor interface
        [RefreshProperties(RefreshProperties.All)]
        [Editor(typeof(FirstNameEditor), typeof(FirstNameEditor))]
        public DateTime Date
        {
            get
            {
                return this.FDate;
            }
            set
            {
                this.FDate = value;
                NotifyPropertyChanged("Date");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
    }

public partial class MainWindow : Window
    {
        CustomAttributEditorPerson temp = new CustomAttributEditorPerson();

        public MainWindow()
        {
            InitializeComponent();

            temp.Date = new DateTime(2020, 7, 7, 0, 1, 2);

            _propertyGrid.SelectedObject = temp;
        }

アプリを起動すると、必要な 7.7.2020 ではなく現在の日付が表示されます。プロパティ temp.Date の変更がプロパティ グリッドに反映されません。次のコードは結果につながりません。

C#

private void Button_Click_1(object sender, RoutedEventArgs e)
        {
              temp.Date = new DateTime(2030, 8, 7, 0, 1, 2);   
              _propertyGrid.Update();        
        }

propertygrid で tempDate の変更を反映するにはどうすればよいですか? 助けてくれてありがとう。

4

1 に答える 1

0

私はあなたのコードでそれを再現しました。これが私のコードです:

メイン ウィンドウの 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:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApplication1"
    xmlns:wt="http://schemas.xceed.com/wpf/xaml/toolkit"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <wt:PropertyGrid x:Name="_propertyGrid" Margin="10" AutoGenerateProperties="True" SelectedObject="{Binding}"/>
    <Button Content="!!"  Width="100" Height="100" Click="Button_Click"/>

</Grid>

分離コード:

public partial class MainWindow : Window
{
    CustomAttributEditorPerson temp = new CustomAttributEditorPerson();

    public MainWindow()
    {
        InitializeComponent();

        temp.Date = new DateTime(2020, 7, 7, 0, 1, 2);

        _propertyGrid.SelectedObject = temp;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        temp.Date = new DateTime(2030, 8, 7, 0, 1, 2);
        _propertyGrid.Update();
    }
}


public class CustomAttributEditorPerson : INotifyPropertyChanged
{
    private DateTime FDate;

    [Category("Information")]
    [DisplayName("Date")]
    //This custom editor is a Class that implements the ITypeEditor interface
    [RefreshProperties(RefreshProperties.All)]
    public DateTime Date
    {
        get
        {
            return this.FDate;
        }
        set
        {
            this.FDate = value;
            NotifyPropertyChanged("Date");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }
}

[Editor(typeof(FirstNameEditor), typeof(FirstNameEditor))]唯一の違いは、Date プロパティに属性がないことです。それがあなたのデータを台無しにしていないかどうかを確認します。

また、プロパティでバインディングを使用している場合は、コード ビハインドでプロパティにSelectedObjectバインドする必要があると思います。Dateなるほど、あなたはすでにINotifyPropertyChanged「モデル」に実装しているので_propertyGrid.Update()、バインディングは更新を処理する必要があるため、必要はありません。

DataContext をコード ビハインドに設定してください。

編集

あなたのコメントを読んだ後、私はそのResolveEditor方法を見て、解決策があると思います(私のマシンでテストしたところ、うまくいきました)。BindingOperations.SetBindingメソッドを に変更DateTimeUpDown.TextPropertyするだけDateTimeUpDown.ValuePropertyです。なぜそうなのかはわかりませんが(ドキュメントが見つかりませんでした)、Text プロパティの値は Value の値によってオーバーライドされ、SetBinding.

于 2015-10-13T10:02:41.087 に答える