2015-02-01 3 views
0

Я очень новичок в WPF и C#, поэтому, пожалуйста, помогите решить эту проблему. У меня есть DataGrid, колонки следующим образом: «Один», «Два», «Умножить».Расчеты WPF DataGrid

Идея, что я ввожу число «Один» или «Два» и получить результат в столбце «Умножьте».

Когда я пишу свой код и отлаживаю его, я вижу, что значение свойства перерасчитывается. Тем не менее, я бы не отобразил в своем последнем столбце, если я не нажму пробел или не нажму на мой последний столбец.

Вот код:

public class Numbers : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private double _one; 
    private double _two; 
    private double _multiply; 

    public double One 
    { 
     get { return _one; } 
     set { _one = value; UpdateValue(); } 
    } 

    public double Two 
    { 
     get { return _two; } 
     set { _two = value; UpdateValue(); } 
    } 

    public double Multiply 
    { 
     get { return _multiply; } 
     set { _multiply = value; UpdateValue(); } 
    } 

    public Numbers(double pOne, double pTwo) 
    { 
     _one = pOne; 
     _two = pTwo; 
     _multiply = GetMultiply(); 
    } 

    private void UpdateValue() 
    { 
     OnPropertyChanged("One"); 
     OnPropertyChanged("Two"); 
     OnPropertyChanged("Multiply"); 
     _multiply = GetMultiply(); 
    } 

    private double GetMultiply() 
    { 
     return _one * _two; 
    } 

    protected void OnPropertyChanged(string name) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 

     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
} 

public class Collection : ObservableCollection<Numbers> 
{ 
    public ObservableCollection<Numbers> Numbers { get; set; } 

    public Collection() 
    { 
     Numbers = new ObservableCollection<Numbers>(); 

     Numbers.Add(new Numbers(1, 2)); 
     Numbers.Add(new Numbers(2, 2)); 
    } 
} 

XAML:

<DataGrid x:Name="StockData" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top" ItemsSource="{Binding}" AutoGenerateColumns="False" LostFocus="StockData_LostFocus" > 
    <DataGrid.Columns > 
     <DataGridTextColumn Header="Number One" Width="100" Binding="{Binding One, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, StringFormat=\{0:C\}}" /> 
     <DataGridTextColumn Header="Number Two" Width="100" Binding="{Binding Two, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, StringFormat=\{0:C\}}" /> 
     <DataGridTextColumn Header="Total" Width="100" Binding="{Binding Multiply, BindsDirectlyToSource=True, Mode=TwoWay, StringFormat=\{0:C\}, UpdateSourceTrigger=PropertyChanged}" /> 
    </DataGrid.Columns> 
</DataGrid> 
+0

кажется сеттер в 'собственности Multiply' должно быть частным. –

ответ

2

Вы настраиваете размножаются после повышения PropertyChanged событие, поэтому интерфейс не получит уведомление о том, что значение было изменено.

Set Multiply, а затем поднять PropertyChanged событие:

private void UpdateValue() 
{ 
    _multiply = GetMultiply(); 
    OnPropertyChanged("One"); 
    OnPropertyChanged("Two"); 
    OnPropertyChanged("Multiply"); 
} 
+0

Большое спасибо, он работает. Так просто ... я потратил 3 дня, пытаясь понять, как заставить его работать. , – Yuki

+0

Рекомендация действительно работает, однако я не понимаю, почему порядок элементов в этом методе важен. если бы вы могли объяснить, или направить меня к дальнейшему чтению, которое будет оценено по достоинству. (как я упомянул им очень новое для WPF и C#) PS: может, в любом случае. – Yuki

+0

Всякий раз, когда какое-либо связанное свойство обновляется, мы должны поднять событие PropertyChanged, чтобы уведомить UI о том, что свойство было изменено, и оно должно обновиться. Таким образом, событие с изменением свойства должно быть поднято всегда после того, как свойство установлено на правильное значение. В вашем случае Multiply устанавливается после того, как измененное свойство было поднято для него. Следовательно, вы не видите обновленного значения в пользовательском интерфейсе. –