使用参数进行数据绑定

时间:2011-08-18 08:25:12

标签: c# wpf data-binding

我目前正在尝试开发小型金融应用程序。我的应用程序需要一个非常复杂的GUI(基本上是一个包含动态行和列以及类别和子类别的表);因为我无法想出一个标准的xaml方式来实现这一点,所以我正在编写一个应该显示我的数据的自定义控件。

长话短说,我直接在C#代码中创建了许多不同的WPF UI元素,而不是在XAML中。现在,我需要一种方法来将这些组件的某些值与动态变化的数据同步。一个明显的例子是我的一些文本框(或标签或其他)需要显示股票的价格。因此,它应该与另一个提供最新价格的类绑定。

我的主要问题是,我事先并不知道需要哪些价格以及应该在哪里显示价格。因此,我所需要的基本上是我的文本框与我的价格对象联系的方式,并且要求"嘿,我需要股票价格US0123456789。请告诉我价格,并在更新该股票的价格时不断更新我的价值。"

我发现的所有数据绑定示例通常都专注于绑定到特定对象实例中的变量,但我不能简单地绑定到PriceObject.Price,因为它不是一个简单的&# 34;价格"变量。毕竟,由价格对象管理的各种不同的股票,每个文本框只需要一个特定股票的价格,所以它需要绑定到像PriceObject.PriceForStock(&# 34; US0123456789&#34)。但是,我无法找到一种绑定方法的方法,而且我也不知道它是怎么可能的。

我能想到的唯一方法是在我的GUI类中使用一个字典,将ISIN作为其键,并将UI元素作为值引用。然后我的GUI可以观察价格对象,每次价格变化,触发事件,GUI类可以手动更新UI元素,如(伪代码传入):

private Dictionary<string, UIElement> displayed_stocks = new Dictionary<string, UIElement>();

private void create_gui()
{
   Textbox textbox = new Textbox();
   displayed_stocks.Add(isin, textbox);
}

private void receive_change_event_of_price_object(string affected_isin, double new_price)
{
  displayed_stocks[affected_isin].Text = new_price.ToString();
}

但我不知道,我觉得这是一个草率的解决方案。特别是因为我不仅需要动态价格而且还需要其他动态信息,例如投资组合持有,这不仅依赖于ISIN而且依赖于ISIN和投资组合ID,因此使用字典不会那么简单。有没有更好的方法呢?我很高兴在那里被推向正确的方向! 感谢

2 个答案:

答案 0 :(得分:1)

如果在绑定的对象上创建索引器,则可以用干净简单的方式绑定参数,有关详细信息,请参阅this link

答案 1 :(得分:0)

使用...

实现动态绑定
  1. Indexer正如Bas上面已经说过的那样。即使ToString()也可以做到这一点。
  2. MultiBinding IMultiValueConverter决定哪些绑定源应生效。 MultiBinding有一个优点,你可以绑定可以在TextBox中显示的所有可能的东西,并将它们发送到转换器(无论是否可用),然后转换器将决定模具和显示哪一个。
  3. 如果源值的优先级顺序是固定的,那么您可以使用PriorityBinding。不需要上面讨论的转换器。