如何在WPF中的DataGridTextColumn绑定上动态更改转换器?

时间:2014-03-12 15:05:15

标签: c# wpf xaml binding converter

我真的不懂WPF和XAML,并且继承了一些非常编写的代码,所以我可能会对此进行屠宰,但是这里有。

我将一个DataGrid绑定(在代码后面)继承到Person对象列表,其中在XAML中指定了必要的DataGridTextColumns(可能是为了允许样式化)。

<DataGrid x:Name="PersonGrid" ItemsSource="{Binding}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Path=LastName}" MaxWidth="Infinity" MinWidth="150" Header="Last Name">
        <DataGridTextColumn Binding="{Binding Path=FirstName}" MaxWidth="Infinity" MinWidth="150" Header="First Name" />
        <DataGridTextColumn Binding="{Binding Path=DOB, StringFormat=\{0:MM/dd/yyyy\}}" MaxWidth="Infinity" MinWidth="200" Header="Date of Birth (MM/DD/YYYY)" />
        <DataGridTextColumn Binding="{Binding Path=Number}" MaxWidth="Infinity" MinWidth="150" Header="(P)erson Number" />
    </DataGrid.Columns>
    <DataGrid.DataContext>
        <dm:Person />
    </DataGrid.DataContext>
</DataGrid>

我想显示该人的最后一个首字母,可选择根据复选框的状态。

<CheckBox Name="ShowFullNames_CheckBox" Content="Show Full Names" IsChecked="False"/>

我能够将转换器连接到后面的代码中的LastName绑定,但是当我尝试在绑定数据后更改该转换器时出现错误(“绑定在使用后无法更改。”)。

我想也许我也可以将复选框IsChecked状态绑定到ConverterParameter或Multibinding的一个绑定,但无法使其工作。

<DataGridTextColumn MaxWidth="Infinity" MinWidth="150" Header="Last Name">
    <DataGridTextColumn.Binding>
        <MultiBinding Converter="myStringTruncator">
            <Binding Source="ShowFullNames_CheckBox" Path="IsChecked"/>
            <Binding Path="LastName"/>
        </MultiBinding>
    </DataGridTextColumn.Binding>
</DataGridTextColumn>

在myStringTruncator的Convert方法中,第一个绑定只是填充了DependencyProperty.UnsetValue,而不是复选框的值。

这可能是一种非常简单的方法,我没有看到。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

您可以将Converter添加到XAML中的Binding。

<DataGridTextColumn Binding="{Binding Path=LastName, Converter={StaticResource YourConverter}"
                    MaxWidth="Infinity"
                    MinWidth="150"
                    Header="Last Name">

但是为了绑定复选框的状态,你必须使用类似这样的东西(未经测试)

<DataGridTextColumn Header="Last Name">
  <DataGridTextColumn.Binding>
    <MultiBinding Converter="{StaticResource NameAndCheckBoxMultiValueConverter}">
      <Binding Path="LastName" />
      <Binding ElementName="myCheckBox" Path="IsChecked" />
    </MultiBinding>
  </DataGridTextColumn.Binding>
 </DataGridTextColumn>

转换器:

  using System;
    using System.Globalization;
    using System.Windows.Data;

    namespace TestWpf
    {
        public class NameAndCheckBoxMultiValueConverter: IMultiValueConverter
        {
            public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
            {
            var lastName = values[0] as String;
            if(lastName != null)
            {
                var isChecked = (bool)values[1];
                if (isChecked)
                {
                    return lastName.Substring(0,1);
                }
                return lastName;
            }
            return null;
            }

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