C# 如何在WPF中动态更改DataGridTextColumn绑定上的转换器?
我真的不理解WPF和XAML,并且继承了一些写得很糟糕的代码,所以我可能会破坏它,但现在开始 我继承了一个绑定到Person对象列表的DataGrid(在代码隐藏中),其中必要的DataGridTextColumns是在XAML中指定的(可能是为了允许样式设置)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"/>
我只想根据复选框的状态显示此人的最后一个首字母
<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();
}
}
}