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

C# 如何在WPF中动态更改DataGridTextColumn绑定上的转换器?,c#,wpf,xaml,binding,converter,C#,Wpf,Xaml,Binding,Converter,我真的不理解WPF和XAML,并且继承了一些写得很糟糕的代码,所以我可能会破坏它,但现在开始 我继承了一个绑定到Person对象列表的DataGrid(在代码隐藏中),其中必要的DataGridTextColumns是在XAML中指定的(可能是为了允许样式设置) 我只想根据复选框的状态显示此人的最后一个首字母 <CheckBox Name="ShowFullNames_CheckBox" Content="Show Full Names" IsChecked="False"/>

我真的不理解WPF和XAML,并且继承了一些写得很糟糕的代码,所以我可能会破坏它,但现在开始

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


我只想根据复选框的状态显示此人的最后一个首字母

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

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

我想也许我也可以将复选框IsChecked state绑定到ConverterParameter或多重绑定的一个绑定,但无法实现

<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方法中,第一个绑定只填充了dependencProperty.UnsetValue,而不是复选框的值

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

也许有一个非常简单的方法可以做到这一点,但我没有看到。有什么想法吗?

您可以在XAML中将转换器添加到绑定中

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

我编辑的时候你回答了,但是一针见血。编辑之后,我需要做的唯一更改是在复选框的多重绑定上使用ElementName而不是Source。谢谢也谢谢你的详尽答复!这些细节确实帮助我更好地理解这一点。你可以把它放在。为了回答以下主题:克隆绑定以在运行时分配转换器,您需要在文件头中声明名称空间,如:xmlns:testWpf=“clr namespace:testWpf”。然后添加转换器:。这有用吗?我从未在另一个类中嵌套过转换器。刚刚发现,这是不可能的:正如您从答案中看到的,问题在于绑定。为了更好地了解绑定的作用,您可以在绑定上设置
PresentationTraceSources.TraceLevel=“High”
,它将向您显示一系列有用的信息(它可能会指出,它没有找到名为
ShowFullNames\u复选框的
Source
)。这是调试问题的一种非常好的方法,特别是对于继承的应用程序;-)
<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();
            }
        }
    }