0

我正在尝试将数据绑定到FormulaFieldWPF 中的自定义数据类型属性。我不明白我是否错过了什么,或者我想做的事情无法完成?

我遵循了如何绑定到原语的约定,发现它不起作用,FormulaField属性没有更新。我还注意到自定义数据类型集方法永远不会被击中。我正在使用 MVVM。

一个模型:

 public class OBQModel : NotificationObject
    {    
        private FormulaField _tovLitres;
        public FormulaField TOVLitres
        {
            get
            {
                if (_tovLitres.UsesFormula)
                {
                    _tovLitres.Value = ConversionHelper.USBarrelsToLitres(_tovBarrels);
                }
                return _tovLitres;
            }
            set
            {
                _tovLitres = value;
                RaisePropertyChanged("TOVLitres");
            }
        }
}

NotificationObject工具INotifyPropertyChanged:_

public abstract class NotificationObject : DependencyObject, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged<T>(Expression<Func<T>> action)
        {
            var propertyName = GetPropertyName(action);
            RaisePropertyChanged(propertyName);
        }

        private static string GetPropertyName<T>(Expression<Func<T>> action)
        {
            var expression = (MemberExpression)action.Body;
            var propertyName = expression.Member.Name;
            return propertyName;
        }

        protected internal void RaisePropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

公式字段看起来像这样:

public class FormulaField
{
    public bool UsesFormula { get; set; }
    public double Value { get; set; }
}

编辑INotifyPropertyChangedFormulaField堆栈溢出中实现...

public class FormulaField : INotifyPropertyChanged
    {
        public bool UsesFormula { get; set; }
        public double Value
        {
            get
            {
                return Value;
            }
            set
            {
                Value = value;
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        // Create the OnPropertyChanged method to raise the event 
        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    }

模型位于ObservableCollectionViewModel 中。

视图的插图:

<StackPanel>
    <DataGrid ItemsSource="{Binding OBQModelCollection}">    
     <DataGrid.Columns>
      <DataGridTemplateColumn Header="new TOV (L)" Width="100">
       <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
         <TextBox BorderThickness="0" 
                  Text="{Binding TOVLitres.Value, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
        </DataTemplate>
       </DataGridTemplateColumn.CellTemplate>
      </DataGridTemplateColumn>
     </DataGrid.Columns>
    </DataGrid>
</StackPanel>
4

1 回答 1

2

根据您所写的内容,您正在“LiquidGOVLitres”上提出 INPC,这似乎没有出现在您的代码清单中,但您已绑定到“TOVLitres”。

修复这种不一致会有所帮助,但如果您希望对其成员的更改成为 UI 的一部分,您还需要在 FormulaField 上实现 INPC。

ETA:在对代码清单进行澄清编辑之后,剩下的任务是在您的 FormulaField 类上实现 INPC 并相应地引发事件。

此外,如果您使用的是 4.5,您可以研究新的 Member Info 类,它有助于避免在 INPC 中使用魔术字符串。

最后,为了语义清晰,将“Value”重命名为“FormulaValue”并没有什么坏处......

为了避免递归,试试这个模型......

    private double _value;
    public double Value
    {
        [DebuggerStepThrough]
        get { return _value; }
        [DebuggerStepThrough]
        set
        {
            if (Math.Abs(value - _value) > Double.Epsilon)
            {
                _value = value;
                OnPropertyChanged("Value");
            }
        }
    }
于 2013-07-12T09:42:14.680 回答