有没有办法在后面的代码中引用绑定

时间:2015-04-21 08:44:03

标签: wpf vb.net xaml data-binding

我在我的应用程序中使用Actipro功能区,并且在使用标准mdi主机时,可以使用将文档标题与主功能区标题集成的方式(对接也是Actipro对接)。现在,虽然我正在使用特定供应商的控件,但我认为/希望我的问题更加通用。

目前提供此功能的Xaml已标记为这样。

<ribbon:RibbonWindow.DocumentName>
    <MultiBinding Converter="{StaticResource ConditionalConverter}">
        <Binding ElementName="window" Path="IsMDIChildMaximized" />
        <Binding ElementName="standardMdiHost" Path="PrimaryWindow.Title" />
        <Binding Source="{x:Null}" />
    </MultiBinding>
</ribbon:RibbonWindow.DocumentName>

功能区本身在后面的代码中命名,我可以写出一些内容;

 MainRibbonWindow.DocumentName

然而,我无法达到MultiBinding。非常具体我想找到一种在xaml中绑定的第二行动态设置ElementName的方法

<Binding ElementName="standardMdiHost" Path="PrimaryWindow.Title" />

因为我知道所引用的实际standardmdihost会改变(其他一切都会保持不变)。

wpf的整个绑定区域仍然是一个非常敏锐的学习曲线,所以我欢迎任何有关如何实现预期结果的建议,或者即使可以在第一名。

我发现了this帖子,但我不确定它是否真的是答案,即使这是我在这种情况下实施它的方式。

非常感谢

修改

意识到我可以通过在这种行中设置绑定来在代码中执行此操作:

 Dim binding As New MultiBinding() With {.Converter = New BooleanAndConverter()}
    binding.Bindings.Add(New Binding("AreWindowsMaximized") With {.Source = host})
    binding.Bindings.Add(New Binding("HasItems") With {.Source = host})
    Me.SetBinding(IsMDIChildMaximizedProperty, binding)

然而是初步尝试

 Dim binding2 As New MultiBinding() With {.Converter = New ConditionalConverter()}
    binding2.Bindings.Add(New Binding("Binding1") with {.ElementName = "MainRibbonWindow", .Path = IsMDIChildMaximized}

并不像预期的那样。如果有人可能会猜测什么可行,我会非常感激。

2 个答案:

答案 0 :(得分:0)

通过将DocumentName属性绑定到视图模型中的属性,您可以获得更多运气。这样,您可以自由地在代码中生成值...也许是这样的:

在XAML中:

<ribbon:RibbonWindow DocumentName="{Binding DocumentName, Mode=OneWay}" ... />

在代码中:

public string DocumentName
{
    get { return string.Format("{0}{1}", Value1, Value2); }
}

private string Value1
{
    get { return value1; }
    set { value1 = value; NotifyPropertyChanged("DocumentName");
}

private string Value2
{
    get { return value2; }
    set { value2 = value; NotifyPropertyChanged("DocumentName");
}

然后,您只需将Value1Value2设置为您需要的任何值,他们将使用DocumentName界面更新INotifyPropertyChanged(或更准确地说,{ {1}}接口将通知UI INotifyPropertyChanged属性中的更改,然后检索最新值。

答案 1 :(得分:0)

万一有人应该偶然发现并遇到类似的问题。我最初的错误是未能正确理解绑定语法如何工作以及成功完成此操作所需的所有线索已经在xaml中,我希望删除并替换机智代码。

最终结果(确实有效)原来是;

 Dim binding2 As New MultiBinding() With {.Converter = New ConditionalConverter()}
    binding2.Bindings.Add(New Binding("IsMDIChildMaximized") With {.Source = MainRibbonWindow})
    binding2.Bindings.Add(New Binding("PrimaryWindow.Title") With {.Source = host})
    SetBinding(DocumentNameProperty, binding2)

这是一个涉及Actipro功能区和对接命令的非常具体的问题,两个源(MainRibbonWindow和host)是我们试图与文档窗口和标准的MdiHost本身集成的标题的主窗口。 p>

我想借此机会向那些阅读此问题并发布建议的人表示感谢,并向Actipro本人表示感谢,他们指出了我的方法错误并提供了最终正确的代码。< / p>