c# - 绑定(bind)到 WPF 中的另一个绑定(bind)

标签 c# wpf xaml mvvm data-binding

在一个简单的 MVVM 应用程序中,我可以将绑定(bind)添加到 View 中的某些属性。该属性可以访问另一个对象并从中返回一个属性值。假设我想在 View 中显示事件项目。如果没有项目处于事件状态,则应显示特殊说明。

现在,当项目被重命名时,名称应该在 View 中更新。如果我只是在属性中返回了项目的名称,它当然不会被更新。

所以我想我可以将 View 绑定(bind)到属性中创建的另一个绑定(bind),该绑定(bind)应该转发 PropertyChanged 事件并相应地更新 View 。但我看到的是“System.Windows.Data.Binding”,而不是像“Project: XYZ”这样的绑定(bind)预期结果。

该项目可以在任何地方重命名,因此我想避免从那里自行引发此 ViewModel 的 PropertyChanged 事件。事情应该自己更聪明一点,而不需要从任何地方插入(当事情变得更复杂时,你经常至少会忘记一次)。

这是代码:

XAML View :

<TextBlock Text="{Binding ActiveProjectName}"/>

C# View 模型:
public object ActiveProjectName
{
    get
    {
        if (ActiveProject != null)
        {
            // This works but won't update automatically:
            //return "Project: " + ActiveProject.Name;
            // This does not work at all:
            return new Binding("Name")
            {
                Source = ActiveProject,
                StringFormat = "Project: {0}"
            };
        }
        return "(No active project)";
    }
}

这有可能吗?它是如何工作的?

最佳答案

除非 事件项目 属性(property)是私有(private)的或 protected ,请使用 后备值 在 xaml 中而不是 if(ActiveProject != null)在后面的代码中

例子

<TextBlock Text="{Binding ActiveProject.Name,StringFormat=Project: {0},FallbackValue=(No active project)}"/>

使用 PriorityBinding有条件绑定(bind)
<TextBlock>
    <TextBlock.Text>
        <PriorityBinding FallbackValue="(No active project)">
            <Binding Path="ActiveProject.Name"
                     StringFormat="Project: {0}"/>
            <Binding Path="SomeOtherProject.Name"
                     StringFormat="Other Project: {0}" />
        </PriorityBinding>
    </TextBlock.Text>
</TextBlock>

在上面的例子中 优先绑定(bind) 将首先尝试绑定(bind)到 事件项目 ,然后将使用 Name 属性来解析该值。如果那不可用,即。 null,那么它将尝试绑定(bind)到 一些其他项目 .要根据绑定(bind)解析值,如果该结果也为 null,则 FallbackValue 将用作 TextBlock 的 Text 属性的值。

关于c# - 绑定(bind)到 WPF 中的另一个绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25114056/

相关文章:

c# - WPF 无法关闭应用程序实例以再次运行它

c# - 我如何处理列表框WPF XAML上的单击和双击事件

c# - 如何平衡多个处理器内核之间的 UI 负载?

c# - TypeScript 通过 ref 参数传递

c# - 使用 MVVM 将列表框滚动到 View 中

c# - 在 WPF DataGrid 中格式化可为空的日期时间

c# - 如何从页面上的线程关闭窗口?

c# - 尝试包装多余的代码是否可以接受?

javascript - JS Date seconds 在 c# 中给出不同的日期

wpf - 确定 xamDataGrid 上的筛选器状态