C# 重写ToString()方法时,绑定行为异常
请参见下面的C# 重写ToString()方法时,绑定行为异常,c#,wpf,xaml,data-binding,datatrigger,C#,Wpf,Xaml,Data Binding,Datatrigger,请参见下面的XAML: <Window x:Class="TabControl.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:TabControl" Title="Main
XAML
:
<Window x:Class="TabControl.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TabControl"
Title="MainWindow" Height="300" Width="300"
xmlns:Interact="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}"
>
<Window.Resources>
<Style TargetType="{x:Type DataGridRow}" x:Key="myStyle">
<Style.Triggers>
<DataTrigger Binding="{Binding IsTrend.Value}" Value="True" >
<Setter Property="Background" Value="Gold"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<ScrollViewer>
<DataGrid ItemsSource="{Binding list}" x:Name="myGrid" RowStyle="{StaticResource myStyle}" >
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name.Value,Mode=TwoWay}" />
</DataGrid.Columns>
</DataGrid>
</ScrollViewer>
课程
要从每个绑定中删除.Value
,我将重写ToString()
方法
public override string ToString()
{
return Value.ToString();
}
和绑定更改为:
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name,Mode=TwoWay}" />
但是对于DataTrigger
和Column
绑定,它的行为不同。有人能解释一下原因和方式吗?更改后,DataTrigger
为什么不工作?
DataTrigger
获取一个CellContent
实例,并使用参数调用Equals()
“True”
。但CellContent对象不等于“True”
如果我覆盖等于
,DataTrigger就会工作
public override bool Equals(object obj)
{
return Value.ToString() == (string) obj;
}
你能解释一下“从我覆盖的每个绑定ToString()
方法中删除.Value
吗?”?双向绑定显然无法将string
值转换回来。我唯一能想到的是ToString是否因为值为null而引发异常,或者value的ToString实现是否引发异常。您的输出窗口中应该有信息。不要使用ToString
来做这样的事情,正如前面提到的,您还破坏了双向绑定。@Sinatr您可能是对的,但我更关心的是为什么绑定和数据触发器的行为不同。。。?在发布问题时…@nkonishvt不,不是。。。。。当在绑定中定义对象时,如果它是基元类型,它将被解析为基元类型,否则它将在应用ToString()方法后解析。。。这就是为什么我否决了这个方法,并对没有得到预期结果感到好奇
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name,Mode=TwoWay}" />
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name,Mode=TwoWay}" />
<DataTrigger Binding="{Binding IsTrend}" Value="True" >
public override bool Equals(object obj)
{
return Value.ToString() == (string) obj;
}