[英]WPF DataGridTextColumn FontWeight Binding / Value Converter not working
[英]How can I dynamically change the converter on DataGridTextColumn binding in WPF?
我真的不了解WPF和XAML,并且继承了一些编写得很糟糕的代码,所以我可能会对此一清二楚。
我继承了绑定到Person对象列表的DataGrid(在后面的代码中),其中在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 Binding,但是在绑定数据后尝试更改该转换器时,出现错误(“绑定已使用后无法更改。”)。
我以为也许我也可以将复选框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,而不是复选框的值。
我可能没有找到一种非常简单的方法来执行此操作。 有任何想法吗?
您可以将转换器添加到XAML中的绑定中。
<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();
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.