我正在尝试使用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; }
}
}
}更新单个绑定列。多值转换器被调用。多值列仍为空。我做错了什么?
发布于 2017-03-04 06:01:35
假设您的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
发布于 2017-03-04 11:15:48
只要您将values[0]转换为IMultiValueConverter的Convert方法中的Convert表示形式(如这里的其他答案所解释),您的示例就会工作。但是,这里的例子有点奇怪,因为不需要MultiBinding。(我知道你知道它们,因为第一栏展示了一种更恰当的方法)。
无论如何,我认为当您想动态设置MultiBinding时,DataGridTextColumn的Binding属性需要一个Binding。在这种情况下,您应该发送DataContext和路径字符串,并在IMultiValueConverter中检索其值。存在an example here,类似于这种情况,在这种情况下,Binding根据DataGridTextColumn头中的值进行更改。
希望能帮上忙。
发布于 2017-03-04 10:43:10
我做错了什么?
应该将Binding属性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>还要确保从转换器返回一个字符串:
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values[0].ToString();
}https://stackoverflow.com/questions/42592321
复制相似问题