WPF 绑定用户控件 属性 不工作
WPF Bind User Control property not working
我有一个用户控件,我正在尝试绑定其属性之一
用户控制Xaml
<UserControl x:Class="pi_browser.Testing.Example"
...
x: Name="LabelControl">
<StackPanel x:Name="RootStackPanel">
<Label Content="{Binding Text, ElementName=LabelControl}"/>
</StackPanel>
</UserControl>
用户控制代码隐藏
public partial class Example : UserControl
{
public Example()
{
InitializeComponent();
ExampleViewModel vm = new ExampleViewModel(State);
DataContext = vm;
}
public Boolean State
{
get { return (Boolean)this.GetValue(StateProperty); }
set { this.SetValue(StateProperty, value); }
}
public static readonly DependencyProperty StateProperty =
DependencyProperty.Register("State",
typeof(Boolean), typeof(Example), new PropertyMetadata(false));
}
主页视图模型
class ExampleViewModel
{
public ExampleViewModel(bool v)
{
val = v;
}
bool val;
public string Text { get => val ? "This worked" : "This didnt work"; }
}
主要WindowXaml
<Window x:Class="pi_browser.Testing.Tester" ... >
<Grid>
<local:Example State="True"/>
</Grid>
</Window>
在这个例子中我没有绑定 State 变量,我只传递了一个文字,但理想情况下我想绑定到实际值。
State
是布尔值,但您绑定到 Text
。让我们通过在您的用户控件上创建依赖项 属性 Text
来解决一个问题。我们将修复 Text
问题而不是布尔值 State
问题。一旦你解决了这个问题,对 State
.
做同样的事情
所以要修复 Text
我们需要修复失败的原因:
<Label Content="{Binding Text, ElementName=LabelControl}"/>
您将 ElementName
设置为 UserControl 本身,这正是我们想要的。但是随后您告诉绑定查找(记住绑定只是对象在幕后的反射)属性 Text
。 属性 Text
在 instance/class 上不存在 ...但是 State
存在。很明显绑定到新创建的 Text
依赖项 属性 在用户控件上 来解决第一个问题。
然后当你在主页上实例化控件时,你需要然后,然后才绑定到 Text
因为 属性 也 驻留在你的视图模型上。
所以三件事,以及 UserControl 中提到的更改:
- 使您的 ViewModel 遵守
INotifyPropertyChanged
并使 Text
属性 使用您安装的通知机制。
- 确保您的主页的
DataContext
设置为您的 ViewModel class. 的有效 实例
- 绑定到
Text
例如 <local:Example State="{Binding Text}"/>
完成后,Text
值将正确地流向 UserControl。
我有一个用户控件,我正在尝试绑定其属性之一
用户控制Xaml
<UserControl x:Class="pi_browser.Testing.Example"
...
x: Name="LabelControl">
<StackPanel x:Name="RootStackPanel">
<Label Content="{Binding Text, ElementName=LabelControl}"/>
</StackPanel>
</UserControl>
用户控制代码隐藏
public partial class Example : UserControl
{
public Example()
{
InitializeComponent();
ExampleViewModel vm = new ExampleViewModel(State);
DataContext = vm;
}
public Boolean State
{
get { return (Boolean)this.GetValue(StateProperty); }
set { this.SetValue(StateProperty, value); }
}
public static readonly DependencyProperty StateProperty =
DependencyProperty.Register("State",
typeof(Boolean), typeof(Example), new PropertyMetadata(false));
}
主页视图模型
class ExampleViewModel
{
public ExampleViewModel(bool v)
{
val = v;
}
bool val;
public string Text { get => val ? "This worked" : "This didnt work"; }
}
主要WindowXaml
<Window x:Class="pi_browser.Testing.Tester" ... >
<Grid>
<local:Example State="True"/>
</Grid>
</Window>
在这个例子中我没有绑定 State 变量,我只传递了一个文字,但理想情况下我想绑定到实际值。
State
是布尔值,但您绑定到 Text
。让我们通过在您的用户控件上创建依赖项 属性 Text
来解决一个问题。我们将修复 Text
问题而不是布尔值 State
问题。一旦你解决了这个问题,对 State
.
所以要修复 Text
我们需要修复失败的原因:
<Label Content="{Binding Text, ElementName=LabelControl}"/>
您将 ElementName
设置为 UserControl 本身,这正是我们想要的。但是随后您告诉绑定查找(记住绑定只是对象在幕后的反射)属性 Text
。 属性 Text
在 instance/class 上不存在 ...但是 State
存在。很明显绑定到新创建的 Text
依赖项 属性 在用户控件上 来解决第一个问题。
然后当你在主页上实例化控件时,你需要然后,然后才绑定到 Text
因为 属性 也 驻留在你的视图模型上。
所以三件事,以及 UserControl 中提到的更改:
- 使您的 ViewModel 遵守
INotifyPropertyChanged
并使Text
属性 使用您安装的通知机制。 - 确保您的主页的
DataContext
设置为您的 ViewModel class. 的有效 实例
- 绑定到
Text
例如<local:Example State="{Binding Text}"/>
完成后,Text
值将正确地流向 UserControl。