我在代码中创建了一个类的实例,并将名为“Name”的类的一个属性绑定到文本框,但绑定不起作用。 你能帮助我吗? 代码背后:
public partial class BlackOilWindow : FluidsWindowClass
{
public Classes.ModelInOutClasses.BlackOilFluidModel _FluidBlackOilClass;
public BlackOilWindow(Classes.ModelInOutClasses.BlackOilFluidModel inputBlackOilClass):base(inputBlackOilClass)
{
if (inputBlackOilClass == null)
{
inputBlackOilClass = new ModelInOutClasses.BlackOilFluidModel();
}
_FluidBlackOilClass = inputBlackOilClass;
InitializeComponent();
}
}
的Xaml:
<TextBox
HorizontalAlignment="Left"
Height="23"
Margin="73,7,0,0"
TextWrapping="Wrap"
VerticalAlignment="Top"
Width="120"
Text="{Binding ElementName=_FluidBlackOilClass, Path=Name, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
/>
答案 0 :(得分:1)
两个问题。首先,它必须是一个属性(并且如果它是公共的,则从前面强调下划线;按照惯例,下划线前缀表示“私有字段”):
public Classes.ModelInOutClasses.BlackOilFluidModel FluidBlackOilClass {
get; set;
}
其次,默认情况下,Binding
会在DataContext
对象上查找指定的属性。据我所说,Window
的{{1}} DataContext
是null
。 ElementName
用于引用具有x:Name
属性的控件,即UI控件。 FluidBlackOilClass
不是那样的。并且(琐事时间!)Mode
在这种情况下是不需要的;控件的属性具有默认值,TwoWay
是TextBox.Text
的默认值。
因此,无论FluidBlackOilClass
是字段还是属性,您的绑定都无法正常工作。 FluidBlackOilClass
是窗口的属性。以下是如何绑定到窗口的属性(或者在这种情况下,属于窗口属性的属性 - 相同的差异,不同的Path
):
<TextBox
HorizontalAlignment="Left"
Height="23"
Margin="73,7,0,0"
TextWrapping="Wrap"
VerticalAlignment="Top"
Width="120"
Text="{Binding FluidBlackOilClass.Name, RelativeSource={RelativeSource AncestorType=Window}, UpdateSourceTrigger=PropertyChanged}"
/>
使用适当的viewmodel实现INotifyPropertyChanged
会更好。您应该按照the accepted answer to this duplicate中的建议,在<{1}}上 实施INotifyPropertyChanged
。这看起来似乎是随意的,但您很快就会发现分离使您的代码更容易处理。
答案 1 :(得分:0)
您在类的成员上使用了绑定。绑定仅适用于Properties。快速修正是这样的:
public Classes.ModelInOutClasses.BlackOilFluidModel _FluidBlackOilClass{get;set;}
根据您的要求调整解决方案。