2016-05-30 29 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

我怎麼會錯過那個...... :(!!!!!!!!!!! ......謝謝:) –