gpt4 book ai didi

WPF 数据网格 : CellEditingTemplate ComboBox multiple data to CellTemplate TextBox

转载 作者:行者123 更新时间:2023-12-03 04:06:25 24 4
gpt4 key购买 nike

我用谷歌搜索了一下,但运气非常有限。我有一个关于可编辑 WPF DataGrid 的问题;在 CellEditingTemplate 中显示 ComboBox,但在 CellTemplate 中显示具有相应 ComboBox 值的 TextBox。我的代码看起来像这样:

<DataGridTemplateColumn Header="Unit">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox Name="comboBoxUnit" ItemsSource="{Binding ...}" SelectedValue="{Binding UnitId, ValidatesOnDataErrors=True}" SelectedValuePath="Id">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Id}" />
<TextBlock Text=" " />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="<would like to have selected Unit's Id and Name here>" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

我怎样才能实现这个目标?类中的单独属性(具有 UnitId 和 UnitName 属性)不是问题,我可以添加它,但是如何将两者绑定(bind)到 ComboBox?我可以访问 CellTemplate 中的 CellEditingTemplate ComboBox 吗?看起来它们位于“不同的命名空间”中,因为我可以在两者中使用相同的名称命名控件...

有什么想法、指点吗?提前致谢,数据库

最佳答案

实现相同目标的最简单方法是使用 DataGridComboBoxColumn .

但是,在我当前的项目中,我们在 DataGridComboBoxColumn 方面遇到了很多问题。我们不再使用它了。相反,我们使用 DataGridTemplateColumnComboBoxCellEditingTemplate和一个 TextBlockCellTemplate (就像你正在做的那样)

为了能够根据 ID 显示数据(在 TextBlock 中获得与 ComboBox 中相同的功能),我们使用名为 CodeToDescriptionConverter 的转换器。 。就可以这样使用了

<TextBlock>
<TextBlock.Text>
<MultiBinding>
<MultiBinding.Converter>
<con:CodeToDescriptionConverter CodeAttribute="Id"
StringFormat="{}{0} - {1}">
<con:CodeToDescriptionConverter.DescriptionAttributes>
<sys:String>Id</sys:String>
<sys:String>Name</sys:String>
</con:CodeToDescriptionConverter.DescriptionAttributes>
</con:CodeToDescriptionConverter>
</MultiBinding.Converter>
<Binding Path="UnitId"/>
<Binding Path="Units"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
  • 第一个Binding是我们寻找的值(Id)
  • 第二个BindingIList我们查看
  • CodeAttribute是我们要与 id 进行比较的属性的名称(第一个 Binding )
  • DescriptionAttributes是我们想要返回的属性,格式为 StringFormat

对于您的情况:在 Units 中查找实例特性在哪里IdUnitId 具有相同的值对于本例,返回 Id 的值和Name格式为{0} - {1}

CodeToDescriptionConverter使用反射来实现这一点

public class CodeToDescriptionConverter : IMultiValueConverter
{
public string CodeAttribute { get; set; }
public string StringFormat { get; set; }
public List<string> DescriptionAttributes { get; set; }

public CodeToDescriptionConverter()
{
StringFormat = "{0}";
DescriptionAttributes = new List<string>();
}

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.Length != 2 ||
values[0] == DependencyProperty.UnsetValue ||
values[1] == DependencyProperty.UnsetValue ||
values[0] == null ||
values[1] == null)
{
return null;
}

string code = values[0].ToString();
IList sourceCollection = values[values.Length - 1] as IList;
object[] returnDescriptions = new object[DescriptionAttributes.Count];
foreach (object obj in sourceCollection)
{
PropertyInfo codePropertyInfo = obj.GetType().GetProperty(CodeAttribute);
if (codePropertyInfo == null)
{
throw new ArgumentException("Code Property " + CodeAttribute + " not found");
}
string codeValue = codePropertyInfo.GetValue(obj, null).ToString();
if (code == codeValue)
{
for (int i = 0; i < DescriptionAttributes.Count; i++)
{
string descriptionAttribute = DescriptionAttributes[i];
PropertyInfo descriptionPropertyInfo = obj.GetType().GetProperty(descriptionAttribute);
if (descriptionPropertyInfo == null)
{
throw new ArgumentException("Description Property " + descriptionAttribute + " not found");
}
object descriptionObject = descriptionPropertyInfo.GetValue(obj, null);
string description = "";
if (descriptionObject != null)
{
description = descriptionPropertyInfo.GetValue(obj, null).ToString();
}
returnDescriptions[i] = description;
}
break;
}
}

// Ex. string.Format("{0} - {1} - {2}", arg1, arg2, arg3);
return string.Format(StringFormat, returnDescriptions);
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}

我在这里上传了一个示例应用程序:CodeToDescriptionSample.zip .
它包括一个DataGridTemplateColumnCodeToDescriptionConverter和一个 DataGridComboBoxColumn做同样的事情。希望这有帮助

关于WPF 数据网格 : CellEditingTemplate ComboBox multiple data to CellTemplate TextBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10909801/

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