我正在尝试使用MultiBinding来更新DataGridTextColumn。
<Window x:Class="WPFBench.MultiBindingProblem"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WPFBench"
mc:Ignorable="d"
Title="MultiBindingProblem" Height="300" Width="300">
<Window.Resources>
<local:MultiValueConverter x:Key="MultiValueConverter"/>
</Window.Resources>
<Grid>
<DataGrid x:Name="dataGrid" AutoGenerateColumns="False"
ItemsSource="{Binding TableA}" ColumnWidth="100*">
<DataGrid.Columns>
<DataGridTextColumn Header="Value" Binding="{Binding Value}"/>
<DataGridTextColumn Header="MultiValue">
<DataGridTextColumn.Binding>
<MultiBinding Converter="{StaticResource MultiValueConverter}">
<Binding Path="Value"/>
<Binding Path="Value"/>
</MultiBinding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
这是转换器...
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace WPFBench
{
public class MultiValueConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values[0];
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
背后的代码......
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace WPFBench
{
/// <summary>
/// Interaction logic for MultiBindingProblem.xaml
/// </summary>
public partial class MultiBindingProblem : Window
{
DataTable _tableA = new DataTable();
public MultiBindingProblem()
{
InitializeComponent();
_tableA.Columns.Add(new DataColumn("Value", typeof(double)));
_tableA.Rows.Add(0.0);
_tableA.Rows.Add(1.0);
_tableA.Rows.Add(2.0);
_tableA.Rows.Add(3.0);
_tableA.Rows.Add(4.0);
DataContext = this;
}
public DataTable TableA
{
get { return _tableA; }
}
}
}
单个绑定列已更新。调用多值转换器。多值列保持空白。我做错了什么?
答案 0 :(得分:1)
您的示例应该有效,只要您将values[0]
转换为string
Convert
IMultiValueConverter
方法中的MultiBinding
表示(如此处其他答案所述)。但是,你的例子有点奇怪,因为不需要MultiBinding
。 (我知道你知道它们,因为第一栏演示了更合适的方法)。
无论如何,当您想要动态设置Binding
时,我认为DataGridTextColumn
的{{1}}属性需要Binding
。在这种情况下,您应该发送DataContext
和路径字符串,并在IMultiValueConverter
中检索其值。类似于这种情况,有an example here Binding
根据DataGridTextColumn
标题中的值进行更改。
希望它有所帮助。
答案 1 :(得分:0)
假设您的Value
类型为int
而不是string
,则会出现此问题,因为没有从对象到字符串的隐式转换
尝试返回
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return String.Format("{0}", values[0]); // don't return an object values[0];
}
来自Convert
方法。
还要设置断点并检查values
是否按预期正确填充。
简单演示证明这是正确答案。
从主窗口的按钮
启动问题窗口private void button_Click(object sender, RoutedEventArgs e)
{
MultiBindingProblem probl = new MultiBindingProblem();
probl.DataContext = new DemoRoughViewModel();
probl.Show();
}
使用简单粗略的视图模型
public class DemoRoughTable
{
public int Value { get; set; } // Notice that it's not a string
}
public class DemoRoughViewModel
{
public List<DemoRoughTable> TableA { get; set; } = new List<DemoRoughTable>()
{
new DemoRoughTable() { Value = 1 }, new DemoRoughTable() { Value = 2 }
};
}
<强> HTH 强>
答案 2 :(得分:0)
我做错了什么?
Binding
的{{1}}属性应设置为DataGridTextColumn
对象,而不是数据绑定值。
如果您打算在列中显示转换器返回的值,则应使用BindingBase
:
DataGridTemplateColumn
还要确保从转换器返回一个字符串:
<DataGridTemplateColumn Header="MultiValue">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource MultiValueConverter}">
<Binding Path="Value"/>
<Binding Path="Value"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>