C# 带参数的数据绑定
我目前正在尝试开发一个小型金融应用程序。我的应用程序需要一个相当复杂的GUI(基本上是一个包含动态行和列以及类别和子类别的表);因为我想不出一种标准的xaml方法来实现这一点,所以我正在编写一个自定义控件来显示我的数据 长话短说,我直接在C#代码中创建了许多不同的WPF UI元素,而不是在XAML中。现在,我需要一种方法将这些组件的一些值与动态变化的数据同步。一个明显的例子是,我的一些文本框(或标签或任何东西)需要显示股票的价格。因此,它应该绑定到另一个提供最新价格的类 我的主要问题是,我事先不知道需要哪些价格以及它们应该显示在哪里。因此,我需要的基本上是一种方式,让我的文本框联系我的价格对象,并询问“嘿,我需要一个股票US0123456789的价格。请告诉我这个价格,并在股票价格更新时不断更新我的值。” 我发现的所有数据绑定示例通常都集中于绑定到特定对象实例中的变量,但我不能简单地绑定到,比如说,PriceObject.Price,因为不可能有一个简单的“Price”变量。毕竟,price对象将管理各种不同的股票,每个文本框只需要一种特定股票的价格,因此它需要绑定到PriceObject.PriceForStock(“US0123456789”)之类的东西。不过,我找不到绑定方法的方法,我也不知道还有什么其他方法可以绑定 我能想到的唯一方法是在我的GUI类中有一个字典,它以ISINs作为键,以对UI元素的引用作为值。然后,我的GUI可以观察Price对象,每次价格变化时,触发事件,GUI类可以手动更新UI元素,比如(伪代码传入):C# 带参数的数据绑定,c#,wpf,data-binding,C#,Wpf,Data Binding,我目前正在尝试开发一个小型金融应用程序。我的应用程序需要一个相当复杂的GUI(基本上是一个包含动态行和列以及类别和子类别的表);因为我想不出一种标准的xaml方法来实现这一点,所以我正在编写一个自定义控件来显示我的数据 长话短说,我直接在C#代码中创建了许多不同的WPF UI元素,而不是在XAML中。现在,我需要一种方法将这些组件的一些值与动态变化的数据同步。一个明显的例子是,我的一些文本框(或标签或任何东西)需要显示股票的价格。因此,它应该绑定到另一个提供最新价格的类 我的主要问题是,我事先不
private Dictionary显示\u stocks=new Dictionary();
私有void create_gui()
{
Textbox Textbox=新建Textbox();
显示股票。添加(isin,文本框);
}
private void接收\u更改\u事件\u价格\u对象(受字符串影响的\u isin,双倍新\u价格)
{
显示的库存[受影响的库存]。Text=新的价格。ToString();
}
但我不知道,我觉得这是一个草率的解决方案。特别是因为我不仅需要动态价格,还需要其他动态信息,比如投资组合持有量,这不仅依赖于ISIN,还依赖于ISIN和投资组合ID,所以使用字典就不会那么简单了。有没有更好的办法?我很高兴被推到正确的方向!
谢谢如果您在绑定到的对象上创建了索引器,那么您可以用一个干净、简单的方式绑定参数,请参阅以获取更多信息。动态绑定是使用
索引器
,正如Bas前面所说。即使是ToString()
也可以做到这一点MultiBinding
与IMultiValueConverter
一起决定哪个绑定源应生效。多重绑定有一个advantage,您可以绑定文本框中显示的所有可能的内容,并将它们发送到转换器(无论是否可用),然后转换器将决定制作和显示哪一个PriorityBinding
。不需要上述转换器谢谢我尝试过使用索引器,但问题似乎是我无法通知与特定索引相关的更改,可以吗?我将在下面发布一个示例,我无法回复我自己的问题,所以这里是这样的:当我使用NotifyPropertyChanged(“Item[])广播更改时;一切正常,但每次有任何变化都会更新。我只想根据项目绑定到的ISIN通知项目,但在执行类似NotifyPropertyChanged(“项目[Test]”)的操作时;它不会更新绑定到测试路径的项。仍在寻找解决方案,到目前为止运气不佳。谢谢你的回复!我刚刚尝试过使用索引器,但是基于它们绑定到的特定键更新值时出现问题。我已经在AngelWPF的回复中描述了这个问题
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();
}