2016-05-30 5 views
-2

siehe unten XAML:zwingende Methode ToString() verhält sich seltsam mit Bindung

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

Quelle von 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; 
} 

Klasse

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)); 
    } 
} 

Um .Value von jeder Bindung I overrideToString() Methode zu entfernen.

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

und Bindung verändert, wie:

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

Aber es ist anders für DataTrigger und Column Bindung verhält. Kann jemand erklären warum und wie? Warum funktioniert DataTrigger nach der Änderung nicht?

+1

Können Sie mehr über * erklären "von jedem zu entfernen' .Value' Bindung I 'ToString()' Methode überschreiben" *? Zweiwege-Bindung ist offensichtlich nicht in der Lage, den "String" -Wert zurück zu konvertieren. – Sinatr

+0

Das einzige, was ich mir vorstellen kann, ist, wenn ToString eine Ausnahme auslöst, weil Value null ist oder die ToString-Implementierung von Value eine Ausnahme auslöst. Sie sollten Informationen in Ihrem Ausgabefenster haben – nkoniishvt

+0

Verwenden Sie 'ToString' nicht, um solche Sachen zu tun, wie bereits erwähnt, brechen Sie auch Zwei-Wege-Bindung. –

Antwort

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

DataGridTextColumn nimmt eine CellContent Instanz und ruft ToString() es angezeigt werden soll. Es zeigt Value, aber ohne .Value in den Pfadänderungen in Datagrid Zellen werden nicht angewendet.

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

DataTrigger nimmt eine CellContent Instanz und ruft Equals() mit Parameter "True". Das CellContent-Objekt ist jedoch nicht gleich "True".

wenn ich Equals außer Kraft setzen, arbeitet Datatrigger

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

Wie kann ich das vermissen ... :(!!!!!!!!!!! ... Danke :) –

Verwandte Themen