MultiBinding在DataGridTextColumn中不起作用

时间:2017-03-04 05:03:35

标签: c# wpf data-binding datagrid

我正在尝试使用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; }
    }
}
}

单个绑定列已更新。调用多值转换器。多值列保持空白。我做错了什么?

3 个答案:

答案 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>