是否可以使用 C#/WPF 控制 Telerik RadPropertyGrid 的可见性?

Is it possible to control visibility for a Telerik RadPropertyGrid with C#/WPF?

我试图通过绑定到 属性 的 Visibility 属性来控制 PropertyDefinition 在 Telerik RadPropertyGrid 中的可见性,但它显示为尽管 PropertyDefinition 忽略对该属性的更改。

控件的XAML代码如下。注意 TestVis.

<Window x:Class="SettingsDialog"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
        Title="SettingsDialog"
        Height="500"
        Width="330">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <telerik:RadPropertyGrid
            Grid.Row="0"
            x:Name="PropertyGrid"
            AutoGeneratePropertyDefinitions="False"
            Item="{Binding}">
            <telerik:RadPropertyGrid.PropertyDefinitions>
                <telerik:PropertyDefinition
                    Binding="{Binding Setting1}"
                    DisplayName="Property 1"
                    Description=""Lorem ipsum dolor sit amet"
                    />
                <telerik:PropertyDefinition
                    Binding="{Binding Setting2}"
                    Visibility="{Binding TestVis}"
                    DisplayName="Property 2"
                    Description=""Lorem ipsum dolor sit amet"
                    />
            </telerik:RadPropertyGrid.PropertyDefinitions>
        </telerik:RadPropertyGrid>
    </Grid>
</Window>

此对话框的代码隐藏如下。

using System.Windows;

public partial class SettingsDialog : Window
{
   private Visibility _TestVis;
   public Visibility TestVis
   {
      get { return _TestVis; }
      set
      {
         this._TestVis = value;
         NotifyPropertyChanged( "TestVis" );
      }
   }

   public bool Setting1 = { get; set; }
   public bool Setting2 = { get; set; }

   public SettingsDialog()
   {
      Setting1 = true;
      Setting2 = true;
      TestVis = Visibility.Collapsed;

      InitializeComponent();
   }
}

我预计这会导致 "Property 2" 不显示,但确实如此。我做错了什么?

我认为这是因为你的绑定在 Rad属性Grid 中并且这个绑定不知道有一个 属性 命名的 TestVis 你还需要一个 booleanConverter 否则它不能正常工作,但由于您正在绑定项目 {binding}.

我认为RelativeSource不是必需的

 Visibility="{Binding TestVis,
 RelativeSource={RelativeSource AncestorType={x:Typtelerik:RadPropertyGrid}}",
 Converter={StaticResource booleanToVisibilityConverter}}">>

添加这个,它应该可以工作。并在您的资源词典中添加对转换器的引用

 <telerik:BooleanToVisibilityConverter x:Key="booleanToVisibilityConverter" />

不幸的是,我的解决方案没有使用绑定。您必须为每个要隐藏的 属性 指定名称。

<telerik:PropertyDefinition
    x:Name="Setting1PropertyDefinition"
    Binding="{Binding Setting1}"
    DisplayName="Property 1"
    Description=""Lorem ipsum dolor sit amet"
    />

然后在后面的代码中使用对您的 SettingsDialog 实例的引用:

dialog.Settings1PropertyDefinition.Visibility = Visibility.Collapsed;