首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MultiBinding不在DataGridTextColumn工作

MultiBinding不在DataGridTextColumn工作
EN

Stack Overflow用户
提问于 2017-03-04 05:03:35
回答 3查看 2K关注 0票数 0

我正在尝试使用MultiBinding来更新DataGridTextColumn。

代码语言:javascript
复制
<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>

这是转换器..。

代码语言:javascript
复制
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();
       }
   }
}

背后的密码..。

代码语言:javascript
复制
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; }
    }
}
}

更新单个绑定列。多值转换器被调用。多值列仍为空。我做错了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-04 06:01:35

假设您的Value是类似于int的值类型,而不是string,则出现此问题是因为没有从对象到字符串的隐式转换。

尝试返回一个

代码语言:javascript
复制
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是否按预期正确填充。

的简单演示证明了,这是正确的答案。

从主窗口的一个按钮启动问题中的窗口

代码语言:javascript
复制
private void button_Click(object sender, RoutedEventArgs e)
{
    MultiBindingProblem probl = new MultiBindingProblem();
    probl.DataContext = new DemoRoughViewModel();
    probl.Show();
}

使用简单、粗略的视图模型

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2017-03-04 11:15:48

只要您将values[0]转换为IMultiValueConverterConvert方法中的Convert表示形式(如这里的其他答案所解释),您的示例就会工作。但是,这里的例子有点奇怪,因为不需要MultiBinding。(我知道你知道它们,因为第一栏展示了一种更恰当的方法)。

无论如何,我认为当您想动态设置MultiBinding时,DataGridTextColumnBinding属性需要一个Binding。在这种情况下,您应该发送DataContext和路径字符串,并在IMultiValueConverter中检索其值。存在an example here,类似于这种情况,在这种情况下,Binding根据DataGridTextColumn头中的值进行更改。

希望能帮上忙。

票数 1
EN

Stack Overflow用户

发布于 2017-03-04 10:43:10

我做错了什么?

应该将Binding属性DataGridTextColumn设置为BindingBase对象,而不是数据绑定值。

如果要在列中显示转换器返回的值,则应使用DataGridTemplateColumn

代码语言:javascript
复制
<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>

还要确保从转换器返回一个字符串:

代码语言:javascript
复制
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
    return values[0].ToString();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42592321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档