我真的不理解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>
在我的StringTruncator类的Convert方法中,第一个绑定只填入了DependencyProperty.UnsetValue,而没有将复选框的值填入。
可能有一种我没注意到的非常简单的方法。你有什么想法吗?
PresentationTraceSources.TraceLevel="High"
,它将向您显示一堆有用的信息(并且它可能已经指出没有找到名为ShowFullNames_CheckBox
的Source
)。 这是调试问题的非常好的方法,特别是对于继承的应用程序来说;-) - RoelF