gpt4 book ai didi

c# - 在一列中具有不同类型控件的未绑定(bind)网格

转载 作者:太空狗 更新时间:2023-10-30 01:23:31 25 4
gpt4 key购买 nike

我正在寻找能够在同一列中显示不同控件(目前为文本框和组合框)的 WinForms 或 WPF 网格。它也必须具有树列表/ TreeView 功能,以便行(节点)之间的层次结构可见。我需要能够在运行时向单元格添加控件并以编程方式更改行高和列宽。
我一直在寻找一段时间,但到目前为止还没有运气。有什么建议么?非常感谢您的帮助。

最佳答案

这个答案的结果。

enter image description here

我会使用标准的 WPF DataGrid,现在还不需要付钱,你可以选择一个模板列,然后在里面做一些数据绑定(bind),下面的例子有一个非常简单的类,我正在绑定(bind)到网格。

public class ListItemType
{
public int Type { get; set; }
public string Text { get; set; }
}

这个类显然可以是任何东西,但在我将类型设置为 1 或 2 的示例中,绑定(bind)列表中类型为 1 的任何对象都会被赋予一个按钮来表示它,任何类型为 2 的对象被赋予一个 CheckBox 来表示它。

数据网格的 XAML 如下所示。 (缩进++)

<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False" Height="200" HorizontalAlignment="Left" Margin="10,10,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="200" >
<DataGrid.Columns>

<!-- The template coloumn -->
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>

<!-- Each cell is put in to a content presenter so I can change it's content -->
<ContentPresenter>
<ContentPresenter.Content>
<Binding Path="Type">
<Binding.Converter>
<local:SwitchConverter>

<local:SwitchConverterCase When="1">
<Button Content="{Binding Text}"></Button>
</local:SwitchConverterCase>

<local:SwitchConverterCase When="2">
<CheckBox Content="{Binding Text}" />
</local:SwitchConverterCase>


</local:SwitchConverter>
</Binding.Converter>
</Binding>
</ContentPresenter.Content>
</ContentPresenter>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>

上面使用的开关转换器只是一个通用转换器,它稍微简化了 XAML 代码,您可以使用任何您想要的转换器,但这里是我使用的那个的代码。

/// <summary>
/// A converter that accepts <see cref="SwitchConverterCase"/>s and converts them to the
/// Then property of the case.
/// </summary>
[ContentProperty("Cases")]
public class SwitchConverter : IValueConverter
{
// Converter instances.
List<SwitchConverterCase> _cases;

#region Public Properties.
/// <summary>
/// Gets or sets an array of <see cref="SwitchConverterCase"/>s that this converter can use to produde values from.
/// </summary>
public List<SwitchConverterCase> Cases { get { return _cases; } set { _cases = value; } }
#endregion
#region Construction.
/// <summary>
/// Initializes a new instance of the <see cref="SwitchConverter"/> class.
/// </summary>
public SwitchConverter()
{
// Create the cases array.
_cases = new List<SwitchConverterCase>();
}
#endregion

/// <summary>
/// Converts a value.
/// </summary>
/// <param name="value">The value produced by the binding source.</param>
/// <param name="targetType">The type of the binding target property.</param>
/// <param name="parameter">The converter parameter to use.</param>
/// <param name="culture">The culture to use in the converter.</param>
/// <returns>
/// A converted value. If the method returns null, the valid null value is used.
/// </returns>
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
// This will be the results of the operation.
object results = null;

// I'm only willing to convert SwitchConverterCases in this converter and no nulls!
if (value == null) throw new ArgumentNullException("value");

// I need to find out if the case that matches this value actually exists in this converters cases collection.
if (_cases != null && _cases.Count > 0)
for (int i = 0; i < _cases.Count; i++)
{
// Get a reference to this case.
SwitchConverterCase targetCase = _cases[i];

// Check to see if the value is the cases When parameter.
if (value == targetCase || value.ToString().ToUpper() == targetCase.When.ToString().ToUpper())
{
// We've got what we want, the results can now be set to the Then property
// of the case we're on.
results = targetCase.Then;

// All done, get out of the loop.
break;
}
}

// return the results.
return results;
}

/// <summary>
/// Converts a value.
/// </summary>
/// <param name="value">The value that is produced by the binding target.</param>
/// <param name="targetType">The type to convert to.</param>
/// <param name="parameter">The converter parameter to use.</param>
/// <param name="culture">The culture to use in the converter.</param>
/// <returns>
/// A converted value. If the method returns null, the valid null value is used.
/// </returns>
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}

/// <summary>
/// Represents a case for a switch converter.
/// </summary>
[ContentProperty("Then")]
public class SwitchConverterCase
{
// case instances.
string _when;
object _then;

#region Public Properties.
/// <summary>
/// Gets or sets the condition of the case.
/// </summary>
public string When { get { return _when; } set { _when = value; } }
/// <summary>
/// Gets or sets the results of this case when run through a <see cref="SwitchConverter"/>
/// </summary>
public object Then { get { return _then; } set { _then = value; } }
#endregion
#region Construction.
/// <summary>
/// Switches the converter.
/// </summary>
public SwitchConverterCase()
{
}
/// <summary>
/// Initializes a new instance of the <see cref="SwitchConverterCase"/> class.
/// </summary>
/// <param name="when">The condition of the case.</param>
/// <param name="then">The results of this case when run through a <see cref="SwitchConverter"/>.</param>
public SwitchConverterCase(string when, object then)
{
// Hook up the instances.
this._then = then;
this._when = when;
}
#endregion

/// <summary>
/// Returns a <see cref="System.String"/> that represents this instance.
/// </summary>
/// <returns>
/// A <see cref="System.String"/> that represents this instance.
/// </returns>
public override string ToString()
{
return string.Format("When={0}; Then={1}", When.ToString(), Then.ToString());
}
}

最后,对于您需要的 TreeView 组件...您实际上可以在每个单元格内放置另一个数据网格,以达到您需要的任何深度级别。

关于c# - 在一列中具有不同类型控件的未绑定(bind)网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11051822/

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