在一个简单的 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/