是否可以使用 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;
我试图通过绑定到 属性 的 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;