【发布时间】:2015-06-13 11:04:35
【问题描述】:
我有一个使用 AvalonDock 的带有窗口管理器的项目。
基本上有两个元素:LayoutAnchorableItem 显示我的不同工具箱(目前是一个,由 Treeview 组成)和 LayoutItem 显示使用 treeview 打开的文档(自定义控件,具有可绑定参数 -理论上)
DockingManager 的 ViewModel 托管名为 Panes 的 ObservableCollection,这将是 LayoutItems。
如果我不尝试在 XAML 中绑定参数并强制使用这样的值,一切都会“正常”
<avalonDock:DockingManager.LayoutItemTemplateSelector>
<panes:PanesTemplateSelector>
<panes:PanesTemplateSelector.ExchangeViewTemplate>
<DataTemplate>
<xchng:Exchange/>
</DataTemplate>
</panes:PanesTemplateSelector.ExchangeViewTemplate>
<panes:PanesTemplateSelector.GraphViewTemplate>
<DataTemplate>
<grph:Graph TickerCode="ILD" ExchangeCode="EPA"/>
</DataTemplate>
</panes:PanesTemplateSelector.GraphViewTemplate>
</panes:PanesTemplateSelector>
</avalonDock:DockingManager.LayoutItemTemplateSelector>
Exchange 是工具箱,Graph 是 LayoutItems。
对接管理器的初始数据绑定是这样完成的:
<avalonDock:DockingManager Margin="0,0,0,0"
Grid.Row="1"
AnchorablesSource="{Binding Tools}"
DocumentsSource="{Binding Panes}"
ActiveContent="{Binding ActiveDocument, Mode=TwoWay, Converter={StaticResource ActiveDocumentConverter}}"
x:Name="dockManager">
请注意,Pane 的类型为 GraphViewModel,它有两个公共参数:ExchangeCode 和 TickerCode。
问题是我想将 TickerCode 和 ExchangeCode 绑定到 Panes.TickerCode 和 Panes.ExchangeCode 值。
所以我尝试了这个:
<grph:Graph TickerCode="{Binding TickerCode, UpdateSourceTrigger=PropertyChanged}" ExchangeCode="{Binding ExchangeCode, UpdateSourceTrigger=PropertyChanged}"/>
但它什么也不做:自定义控件中的 TickerCode 和 ExchangeCode 等于 "",这与我强制 XAML 中的值相反。
另外有点奇怪的是,如果我介入代码执行,Panes 实际上有 TickerCode 和 ExchangeCode 的值,它们只是不绑定。例如,实际创建窗格的代码是
public void AddGraph(string FullName, string ExchangeCode, string TickerCode)
{
var graphViewModel = new GraphViewModel(FullName, ExchangeCode, TickerCode);
_panes.Add(graphViewModel);
ActiveDocument = graphViewModel;
}
在这里,每一步都有两个值。假设我添加了 5 个不同的窗格,它们都有正确的 ExchangeCode 和 TickerCode,但没有任何内容传递给自定义控件。
如果您需要有关绑定值的自定义控件的更多信息,请使用以下代码:Passing parameters to custom control (databinding)。
备注:如您所见,我没有放太多代码,如果您认为可能有帮助,请提出请求,我会添加所需的内容。请注意,整个窗口管理器的全局逻辑与 AvalonDock 测试应用程序(AvalonDock.MVVMTestApp)中提供的相同。
【问题讨论】:
-
我猜我使用的数据绑定方法有问题。如果取出与我当前问题无关的所有内容并创建一些空白项目,其 MainWindow 仅由自定义控件 Graph 和只有两个参数的 datacontext 组成,并将它们绑定到自定义控件:同样的问题,尽管参数实际上存在于数据上下文,但不传递给自定义控件。我去看看……
标签: c# wpf data-binding avalondock