gpt4 book ai didi

c# - bool 到 System.Windows.Visibility(动态创建 DataGridColumnHeaders 时的绑定(bind)问题)

转载 作者:太空宇宙 更新时间:2023-11-03 16:31:52 25 4
gpt4 key购买 nike

我遇到了一个场景,我必须动态创建数据网格列并且必须在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com