我正在尝试将简单标签的Content
属性绑定到其他类的属性。我已经尝试了各种方法,但它还没有用。
这是源类中的属性(MainWindow.xaml.cs):
public String FileTitle
{
get
{
return this.GetValue(FiletitleProperty) as string;
}
set
{
this.SetValue(FiletitleProperty, value);
}
}
public DependencyProperty FiletitleProperty;
public MainWindow()
{
FiletitleProperty = DependencyProperty.Register("FileTitle", typeof(String), typeof(MainWindow));
...
}
在我的目标类中,我有一个名为CallbackObject
的源类对象(命名不太合适)
这是我绑定的xaml代码:
<Label x:Name="lblFiletitle" Content="{Binding Source=CallbackObject, Path=FileTitle}" Margin="10,213,10,0" Height="35" VerticalAlignment="Top" FontSize="16" Padding="0,5,5,5" />
甚至可以这样做,还是让它变得更复杂和不优雅?
答案 0 :(得分:1)
如果代码中有CallbackObject
,请尝试:
<Label Content="{Binding RelativeSource={RelativeSource AncestorLevel=1, AncestorType=UserControl,Mode=FindAncestor}, Path=CallbackObject.FileTitle}" />
答案 1 :(得分:0)
如果您的标签放在UserControl或Page内,则不能直接绑定到另一个对象(无论是Window还是其他对象)中的属性,而无需在-let的说法中创建该对象的实例或引用 - UserControl 。层次结构中的父元素(XAML中最顶层的元素)定义子元素的DataContext范围。它们只能绑定到该范围内的东西。
有一些解决方法:
您可以相对轻松地调用静态属性,然后调用类似“{x:Static local:StaticClass.StaticProperty}”的绑定。
您可以在UserControl中创建引用对象的实例(在XAML中或后面的代码中),并将UserControl的DataContext设置为自身。必须使用公共get和set(如果需要)加密器在公共属性中公开引用的对象。如果您实现INotifyPropertyChanged(无论您喜欢哪个),则不需要依赖属性。
如果您想从其他Window或其他ViewModel获取数据,有很多方法可以实现。这里发布的时间太长(太“可用”),快速搜索会给你很多结果。
在你的情况下,我猜你的app中只有一个MainWindow,所以也许你可以创建一个静态属性来返回当前的MainWindow实例,然后从任何地方绑定到它的任何属性。
MainWindow.xaml.cs中的此代码
private static MainWindow_instance;
public static MainWindow Instance
{
get
{
if (_instance == null)
_instance = new MainWindow();
else
_instance = this;
return _instance;
}
}
警告:这在某些情况下适合我,但我从未将它用于MainWindow,我不确定这是最好的做法。但它确实有用。
希望这有帮助,尊重!