【问题标题】:How to display values of a bound datagrid如何显示绑定数据网格的值
【发布时间】:2013-09-27 11:21:50
【问题描述】:

我有一个 WPF 应用程序,我正在使用 MVVM 设计方法。

我有一个 ObservableObject,它包含下面的类 Transaction 的列表;

public Transaction
{
    public string Ammount;
    public string Direction;
}

我的 ViewModel 中的 ObservableObject 在下面

public ObservableCollection<Transactions> ListOfUserTransactions
        {
            get { return _localTransactionData; }
            set
            {
                _localTransactionData = value;
                RaisePropertyChanged("ListOfUserTransactions");
            }
        }

而我的观点就是这样绑定的;

<DataGrid ItemsSource="{Binding ListOfUserTransactions}" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Ammount" Binding="{Binding Path=Ammount}"  Foreground="Black" IsReadOnly="True" />

                <DataGridTextColumn Header="Direction" Binding="{Binding Path=Direction}" Foreground="Black" IsReadOnly="True" />
            </DataGrid.Columns>
</DataGrid>

这确实起作用,因为产生的行数等于我的预期,但所有行都是空的,我认为这是我绑定 DataGridTextColumn 的方式,但我不确定如何做,希望有上面的问题已经足够详细了。

编辑

以下是交易列表的创建方式

ObservableCollection<Transaction> _localTransactionData = new ObservableCollection<Transaction>();


        public TransactionsViewModel(User passedThroughUser)
        {
            _user = passedThroughUser;
            _listOfTransactions = _user.Transactions;

            foreach (var item in _listOfTransactions)
            {
                LocalTransactionsList tran = new LocalTransactionsList();
                tran.Ammount = item.Ammount.ToString(); ;
                tran.Direction = item.Direction;
                _localTransactionData.Add(tran);
            }
        }

【问题讨论】:

  • 我没有运气,仍然是空白字段
  • 你能展示一下Transaction的完整实现吗,我不想让你调试这些属性的getter,所以为每个属性添加一个私有值并返回并设置它。
  • 您是否考虑过让您的文本列绑定到属性而不是字段?
  • 不抱歉,我该怎么做?
  • 我会在下面给出这个答案...

标签: wpf data-binding mvvm datagrid


【解决方案1】:

你的问题在这里:

public Transaction
{
    public string Ammount;
    public string Direction;
}

应该是:

public Transaction
{
    public string Ammount {get;set;}
    public string Direction {get;set;}
}

绑定属性必须有setter和getter。

【讨论】:

  • 啊,它一直把我绕过几个小时,就像那样简单,我一直看着那个课程思考'它不能那样'并继续前进,非常感谢那个 span>
  • 很高兴它解决了您的问题。无论如何,@Garry Vass 也是一个很好的答案......他的解决方案允许您在“数据源”更改时在 UI 上显示修改。
【解决方案2】:

您可以通过将 Transaction 类更改为此...

public class Transaction : INotifyPropertyChanged
{
    private string _amount;
    public string Amount
    {
        [DebuggerStepThrough]
        get { return _amount; }
        [DebuggerStepThrough]
        set
        {
            if (value != _amount)
            {
                _amount = value;
                OnPropertyChanged("Amount");
            }
        }
    }
    private string _direction;
    public string Direction
    {
        [DebuggerStepThrough]
        get { return _direction; }
        [DebuggerStepThrough]
        set
        {
            if (value != _direction)
            {
                _direction = value;
                OnPropertyChanged("Direction");
            }
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string name)
    {
        var handler = System.Threading.Interlocked.CompareExchange(ref PropertyChanged, null, null);
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}

这将使 WPF 绑定引擎能够访问您的属性并正确绑定它们。

更多关于 INPC 的信息在这里http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

【讨论】:

    猜你喜欢
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2017-01-14
    • 1970-01-01
    • 2018-06-18
    • 2014-04-04
    相关资源
    最近更新 更多