- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我遇到了一个场景,我必须动态创建数据网格列并且必须在 C# 代码中创建列。我在每个生成的列的单独代码区域中都有一个复选框。该复选框确定特定列是隐藏还是可见。该复选框绑定(bind)到 GameAttributes.Visible 属性。但是,DataGrid Visibility 属性属于不同的类型。我尝试使用 BooleanToVisibilityConverter,但仍然收到编译错误(如我所料)。是否有解决此问题的有效方法?
我遇到的错误:
Cannot implicitly convert type 'bool' to 'System.Windows.Visibility'
编辑:编译器错误已得到解决,但绑定(bind)似乎不适用于可见性。
XAML:
<DataGrid ItemsSource="{Binding}"
DockPanel.Dock="Top"
AutoGenerateColumns="False"
HorizontalAlignment="Stretch"
Name="GameDataGrid"
VerticalAlignment="Stretch"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserResizeRows="False"
IsReadOnly="True"
>
查看:
GameAttributes.Add(new GameInfoAttributeViewModel() { Visible = true, Description = "Name", BindingName = "Name" });
GameAttributes.Add(new GameInfoAttributeViewModel() { Visible = false, Description = "Description", BindingName = "Description" });
GameAttributes.Add(new GameInfoAttributeViewModel() { Visible = false, Description = "Game Exists", BindingName = "GameExists" });
foreach (GameInfoAttributeViewModel attribute in GameAttributes)
{
DataGridTextColumn column = new DataGridTextColumn
{
Header = attribute.Description,
Binding = new Binding(attribute.BindingName),
};
Binding visibilityBinding = new Binding();
visibilityBinding.Path = new PropertyPath("Visible");
visibilityBinding.Source = attribute;
visibilityBinding.Converter = new BooleanToVisibilityConverter();
BindingOperations.SetBinding(column, VisibilityProperty, visibilityBinding);
GameDataGrid.Columns.Add(column);
}
View 模型:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Windows;
namespace DonsHyperspinListGenerator
{
class GameInfoAttribute
{
public string Description { get; set; }
public bool Visible { get; set; }
public string BindingName { get; set; }
}
//todo: move to separate class
class GameInfoAttributeViewModel : INotifyPropertyChanged
{
private GameInfoAttribute mGameInfo = new GameInfoAttribute();
public string Description
{
get { return mGameInfo.Description; }
set
{
if (mGameInfo.Description != value)
{
mGameInfo.Description = value;
InvokePropertyChanged("Description");
}
}
}
public bool Visible
{
get { return mGameInfo.Visible; }
set
{
if (mGameInfo.Visible != value)
{
mGameInfo.Visible = value;
InvokePropertyChanged("Visible");
}
}
}
public string BindingName
{
get { return mGameInfo.BindingName; }
set
{
if (mGameInfo.BindingName != value)
{
mGameInfo.BindingName = value;
InvokePropertyChanged("BindingName");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void InvokePropertyChanged(string propertyName)
{
var e = new PropertyChangedEventArgs(propertyName);
PropertyChangedEventHandler changed = PropertyChanged;
if (changed != null) changed(this, e);
}
}
}
最佳答案
与您的绑定(bind)或值转换器没有任何关系。你正在做这个任务:
Visibility = attribute.Visible
在 View 中创建新列的位置。
那是你的编译错误。可见性是一个 System.Windows.Visibility,而 attribute.Visible 是一个 bool 值。您不能将可见性设置为 bool 值。如果这个值是通过 Binding 设置的,那么你真的不需要手动设置它(实际上它会清除你的 Binding)。
编辑:
下面是一个示例,说明如何在后面的代码中设置绑定(bind)以使用值转换器:
var binding = new Binding();
binding.Source = attribute;
binding.Path = new PropertyPath("Visible");
binding.Converter = (BooleanToVisibilityConverter)Resources["BoolToVisibilityConverter"];
BindingOperations.SetBinding(column, DataGridTemplateColumn.VisibilityProperty, binding);
第二次编辑:我在上面的代码中看到了一些可能存在问题的地方:
首先,当您设置绑定(bind)时,您似乎只是在“VisibilityProperty
”上为 DependencyProperty 设置绑定(bind)。我不确定在您的 View 上下文中是什么(可能是 UserControl.VisibilityProperty
等)。您要设置的特定 DependencyProperty 位于 DataGridTemplateColumn 类型上,因此我相信您会希望将其设置为 DataGridTemplateColumn.VisibilityProperty
。
所以这一行:BindingOperations.SetBinding(column, VisibilityProperty, visibilityBinding);
变成这样:BindingOperations.SetBinding(column, DataGridTemplateColumn.VisibilityProperty, visibilityBinding);
另一件事是 DataGridTextColumn 的对象初始值设定项中的这一行:
Binding = new Binding(attribute.BindingName),
我不确定您对该行做了什么,但它可能会导致列的整体 DataContext 出现问题(这可能反过来会导致 Visibility 绑定(bind)出现问题)。我不确定这是一个问题,但绝对不需要设置可见性绑定(bind)。我在一个示例项目中使用了我在答案中提供的代码,并且我在上面提供的行中添加了所有代码(在删除导致编译错误的列初始值设定项中的分配之后。
关于c# - bool 到 System.Windows.Visibility(动态创建 DataGridColumnHeaders 时的绑定(bind)问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10576747/
我制作了一个 DIV 和 visibility: hidden 并附加了一个 ::before 这个 DIV 的伪元素 visibility : 可见。这在 Firefox、Chrome 和 Safa
我正在使用 jquery 可见选择器来检查子元素是否可见。但令人惊讶的是 .is("visible") 和 .is(":visible") 在使用 css Visibility:hidden 时显示不
我有这个代码 #checkboxDIV { visibility: hidden; } #itemcard:hover #checkboxDIV {
我有一个用 ul 创建的菜单/li列出。 为了创造一个不错的效果,我有以下 css: #menu ul { /* ... */ visibility:hidden; /* ..
我想要的是,当我点击 Dashboard Button 时,它会像 SlidingDrawer 一样打开,打开后再次点击它会关闭。我使用这个自定义抽屉是因为 SlidingDrawer 已弃用。 现在
如何使用 jQuery 只选择可见元素? jQuery 选择器 :visible 和 :hidden 只尊重 display:none 作为真的隐藏?不是可见性:隐藏或可见性:可见。 我知道它们在技术
为什么我的 $('#myDiv').css('visibility', 'visible'); 不起作用? $('#clickdiv').click(function() { alert($(
在 $(document).ready 函数中通过 JavaScript 将子容器设置为 visibility: visible 时,我遇到了一个奇怪的问题。 问题是: 我有一个父元素,它有 boot
在 jQuery 中: e.is(':visible'); 检查元素是否显示。 jQuery 中是否有一个函数可以检查元素是否具有隐藏或可见属性可见性? 现在我必须自己实现这个功能。但我想使用 jQu
我在 mvc 中使用一个帖子表单,在帖子中我想显示一个隐藏的 div(惊喜)。 我正在使用 js/jquery 来显示 div,它可以在所有浏览器中工作,除了 mac 上的 safari :( 我现在
我似乎无法获得我的 jquery {{NotificationNavDot}} 功能正常工作! 在下面找到帮助文件: {{NotificationNavDot}} 在下面找到我的帮助
WPF 中的 Visibility.Collapsed 和 Visibility.Hidden 有什么区别? 最佳答案 不同之处在于,Visibility.Hidden隐藏了控件,但保留了它在布局中占
我有一个 if 语句来检查我的 div 下面是否没有任何可见内容,如果是,我会隐藏子元素的同级元素。 var $remainingprojects = $searchproject.s
这是我的菜单模型 HTML Menu 1 (overflow:hidden) Item 1 submenu 1 submen
编辑 3 实际上,我根本不需要弄乱可见性/不透明度...所以我删除了那些行(如编辑 2 所示)...添加了动画 -播放状态:暂停/运行.... 得到了我想要的效果... 编辑 2:感谢 Gineto
在我的应用程序中有一个广告 WebView ,它在 Activity 开始时调用一个 url。一切都很好,除了一件小事,它更像是一个可见性问题......所以问题是,当我开始 Activity 时,我
根据 the "visible" binding documentation , 如果 visible 的值为 false,Knockout 使用 display: none 隐藏元素。我怎样才能让它
* { margin: 0; padding: 0; border: 0; } .navBar { background-color: #2A2A2A; min-width: 10
android 布局使用 layout_weight。我的目标是所有组件的 1/3,但有时页脚实际上设置为消失,然后可见。从 gone 设置为 visible 时,权重计算如何工作?我没有看到具有 1
我有两个单选按钮,两个文本框和一个按钮。 当我点击第一个按钮时,应该只会出现一个文本框,当我点击第二个按钮时,应该会出现两个文本框。 但我想使用 visibility:hidden|visible 属
我是一名优秀的程序员,十分优秀!