C# 绑定到AvalonDock 2中的LayoutOnTableItem可见性
我正在尝试将C# 绑定到AvalonDock 2中的LayoutOnTableItem可见性,c#,wpf,avalondock,C#,Wpf,Avalondock,我正在尝试将layoutAchorableItem的可见性绑定到ViewModel中的布尔值,以便以编程方式显示和隐藏锚点: 但是,每当我隐藏锚定对象时,都会引发异常: 对象引用未设置为实例 位于…\Xceed.Wpf.AvalonDock\Layout\LayoutContent.cs中的Xceed.Wpf.AvalonDock.Layout.LayoutContent.Close():第346行 在…\Xceed.Wpf.AvalonDock\Controls\LayoutItem.cs
layoutAchorableItem
的可见性
绑定到ViewModel中的布尔值,以便以编程方式显示和隐藏锚点:
但是,每当我隐藏锚定对象时,都会引发异常:
对象引用未设置为实例
位于…\Xceed.Wpf.AvalonDock\Layout\LayoutContent.cs中的Xceed.Wpf.AvalonDock.Layout.LayoutContent.Close():第346行
在…\Xceed.Wpf.AvalonDock\Controls\LayoutItem.cs中的Xceed.Wpf.AvalonDock.Controls.LayoutItem.OnVisibilityChanged()处:第310行
在…\Xceed.Wpf.AvalonDock\Controls\layoutachrableem.cs中的Xceed.Wpf.AvalonDock.Controls.layoutachrableem.OnVisibilityChanged()处:第299行
在…\Xceed.Wpf.AvalonDock\Controls\LayoutItem.cs中的Xceed.Wpf.AvalonDock.Controls.LayoutItem.OnVisibilityChanged(DependencyObject s,DependencyPropertyChangedEventArgs e)处,第303行
在…\Xceed.Wpf.AvalonDock\Controls\LayoutItem.cs中的Xceed.Wpf.AvalonDock.Controls.LayoutItem.b_u1(DependencyObject s,DependencyPropertyChangedEventArgs e)处:第37行
在System.Windows.PropertyChangedCallback.Invoke(DependencyObject d,DependencyPropertyChangedEventArgs e)
位于System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
...
注释掉绑定到可见性后,锚定对象将按预期隐藏 tl;博士
您需要在绑定中添加一个具有值可见性的ConverterParameter
。Hidden
:
<Setter Property="Visibility" Value="{Binding Model.IsVisible, ConverterParameter={x:Static Visibility.Hidden}, Converter={StaticResource btvc}, Mode=TwoWay}"/>
根据微软的说法,System.Windows.Visibility.Collapsed
意味着在布局过程中该项目不可见,也没有为其保留空间。这听起来像是当我们点击X
隐藏锚点时锚点发生的事情(这可能发生在视觉树的某个地方)。但是,为什么评论说,这通常不需要锚定?如果我们查看layoutachrableItem.OnVisibilityChanged()
:
很明显,AvalonDock使用了可见性.Hidden
值来指示锚具是隐藏的。(这让我有点困惑,因为Microsoft声明隐藏
隐藏元素,但在布局中保留空间,而这不是隐藏锚定对象时的行为。)那么为什么可见性折叠
而不是隐藏
?答案就在BooltVisibilityConverter
中
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is bool && targetType == typeof(Visibility))
{
bool val = (bool)value;
if (val)
return Visibility.Visible;
else
if (parameter != null && parameter is Visibility)
return parameter;
else
return Visibility.Collapsed;
}
// ...
}
除非传递类型为Visibility
的参数,否则当布尔值为false时,将使用Visibility.Collapsed
。我们希望false表示可见性。隐藏
,因此我们将其设置为转换器参数
<Setter Property="Visibility" Value="{Binding Model.IsVisible, ConverterParameter={x:Static Visibility.Hidden}, Converter={StaticResource btvc}, Mode=TwoWay}"/>
我以前没有注意到问题的后续内容。谢谢你把事情弄清楚了?这意味着我可以继续使用主回购协议的来源。(对于其他人,这是我的相关问题:)谢谢!非常感谢。非常感谢。非常感谢。非常感谢。
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is bool && targetType == typeof(Visibility))
{
bool val = (bool)value;
if (val)
return Visibility.Visible;
else
if (parameter != null && parameter is Visibility)
return parameter;
else
return Visibility.Collapsed;
}
// ...
}
<Setter Property="Visibility" Value="{Binding Model.IsVisible, ConverterParameter={x:Static Visibility.Hidden}, Converter={StaticResource btvc}, Mode=TwoWay}"/>