WPF PropertyGrid没有';t应用属性值

本文关键字:应用 属性 PropertyGrid 没有 WPF | 更新日期: 2023-09-27 18:01:12

我正在使用Denis Vuyka对WPF的财产控制。

我的问题是,如果我不按TAB键,它就不会应用属性的新值。

因此,如果我在属性网格中更改一个属性,然后单击"确定"按钮,该属性仍然是以前的值。

要复制的示例代码:

public partial class MainWindow : Window
{
    DataObject dataObject = new DataObject();
    public MainWindow()
    {
        InitializeComponent();
        propertyGrid.SelectedObject = dataObject;
    }
    private void OnOK(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("Value of test is " + dataObject.test);
    }
}

class DataObject
{
    public int test { get; set; }
    public int test2 { get; set; }
}

<Window x:Class="PropGridTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:pg="http://schemas.denisvuyka.wordpress.com/wpfpropertygrid" 
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="50" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Button Grid.Row="0" IsDefault="True" Click="OnOK">OK</Button>
        <pg:PropertyGrid x:Name="propertyGrid" Grid.Row="1">
        </pg:PropertyGrid>
    </Grid>
</Window>

只需在属性测试中键入一个数字,然后单击"确定"按钮。

有人知道这个问题的解决方法吗?

这是我迄今为止在OnOK中尝试过的,但没有成功:

        propertyGrid.Focus();
        propertyGrid.MoveFocus(new System.Windows.Input.TraversalRequest(System.Windows.Input.FocusNavigationDirection.Next));
        System.Windows.Forms.SendKeys.SendWait("{TAB}");

WPF PropertyGrid没有';t应用属性值

您需要编辑源代码并更改文本编辑器上的绑定,使其使用UpdateSourceTrigger=PropertyChanged

要查找需要更新的源区域,可以使用Snoop检查控件。

运行应用程序,启动snoop,从snoop工具的下拉菜单中选择应用程序,然后单击双筒望远镜。现在,如果您按住shiftctrl键,同时将光标悬停在控件上,您将能够看到它的类型及其所有属性。

之后,您只需要搜索解决方案即可找到该类型并在XAML中编辑绑定。有关如何使用UpdateSourceTrigger绑定属性的信息,请查看此页面。

我不知道这个网格的确切情况(我使用这个(,但我在那里也有同样的问题。这似乎是一个常见的问题。在选择新对象或清除所选对象属性之前,请尝试将焦点从PropertyGrid移到另一个控件。例如:

    public static void UpdatePropertyGridObjects(object objToSelect)
    {
        Components.DockManager.Focus();
        Components.PropertyGrid.SelectedObject = objToSelect;
    }