【发布时间】:2014-04-16 19:53:34
【问题描述】:
我真的不懂 WPF 和 XAML,并且继承了一些写得非常糟糕的代码,所以我可能会扼杀这个,但这里是。
我继承了一个绑定到 Person 对象列表的 DataGrid(在后面的代码中),其中必要的 DataGridTextColumns 在 XAML 中指定(可能是为了允许样式设置)。
<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"/>
我能够在后面的代码中将转换器连接到姓氏绑定,但是当我在绑定数据后尝试更改该转换器时出现错误(“绑定在使用后无法更改。”)。
我想也许我也可以将复选框 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 填充,而不是复选框的值。
可能有一种我没有看到的非常简单的方法来做到这一点。有什么想法吗?
【问题讨论】:
-
从答案中可以看出,问题出在绑定上。为了更好地理解绑定在做什么,您可以在绑定上设置
PresentationTraceSources.TraceLevel="High",它会向您显示一堆有用的信息(它可能会指出它没有找到名为@的Source987654326@)。这是调试问题的好方法,尤其是对于继承的应用程序 ;-)
标签: c# wpf xaml binding converter