2016-05-30 68 views
-2

见下文XAML压倒一切的ToString()方法,奇怪的行为用结合

<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> 

源的DataGrid

private ObservableCollection<dynamic> GetDynamicOrders2() 
{ 
    var retVal = new ObservableCollection<dynamic>(); 
    for (int i = 0; i < 50; i++) 
    { 
     dynamic eo = new ExpandoObject(); 
     eo.Name = new CellContent("Order" + i); 
     eo.IsTrend = new CellContent(i % 2 == 0);    
     retVal.Add(eo); 
    } 
    return retVal; 
} 

public sealed class CellContent : INotifyPropertyChanged 
{ 
    private object _value; 
    public object Value 
    { 
     get { return _value; } 
     set 
     {     
      _value = value; 
      OnPropertyChanged("Value");    
     } 
    } 

    public CellContent(object value) 
    { 
     Value = value;    
    }    

    public event PropertyChangedEventHandler PropertyChanged;     
    private void OnPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

从每个结合我overrideToString()方法除去.Value

public override string ToString() 
{ 
    return Value.ToString(); 
} 

和有约束力的改变为:

<DataGridTextColumn Header="Name" Binding="{Binding Path=Name,Mode=TwoWay}" />  

但它表现为不同和DataTrigger绑定Column。有人可以解释为什么和如何?为什么DataTrigger在更改后无法工作?

+1

你能解释一下* “从各个结合我重写'的ToString()'方法去除'.Value'” *?双向绑定显然不能将字符串值转换回来。 – Sinatr

+0

我能想到的唯一情况是ToString抛出异常,因为Value为null或Value的ToString实现抛出异常。你应该在你的输出窗口中有信息 – nkoniishvt

+0

不要使用'ToString'来做这样的事情,正如已经提到的那样,你也打破了双向绑定。 –

回答

1
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name,Mode=TwoWay}" /> 

DataGridTextColumn需要CellContent实例并调用ToString()来显示它。它显示Value,但在没有.Value的路径中,数据网格单元格中的编辑未应用。

<DataTrigger Binding="{Binding IsTrend}" Value="True" > 

DataTrigger需要CellContent实例,并与参数"True"调用Equals()。但CellContent对象不等于"True"

如果我重写Equals,DataTrigger工作

public override bool Equals(object obj) 
{ 
    return Value.ToString() == (string) obj; 
} 
+0

我怎么会错过那个...... :(!!!!!!!!!!! ......谢谢:) –