C# 如何将UserControl中控件的属性绑定到包含它的窗口的属性?
我有一个主窗口。它包含一个带有文本框的UserControl1实例。MainWindow还包含设置类的实例。我想将TextBox绑定到Settings类的string属性 困难在于UserControl1不了解MainWindow或设置(因为我想在多个项目中使用UserControl1)。所以我制作了一个接口IString,并将其传递给UserControl1。然而,我仍然无法获得任何工作绑定。我意识到我必须在某个时候添加INotifyPropertyChanged,但我不认为这是阻止它在这里工作的原因C# 如何将UserControl中控件的属性绑定到包含它的窗口的属性?,c#,.net,wpf,data-binding,C#,.net,Wpf,Data Binding,我有一个主窗口。它包含一个带有文本框的UserControl1实例。MainWindow还包含设置类的实例。我想将TextBox绑定到Settings类的string属性 困难在于UserControl1不了解MainWindow或设置(因为我想在多个项目中使用UserControl1)。所以我制作了一个接口IString,并将其传递给UserControl1。然而,我仍然无法获得任何工作绑定。我意识到我必须在某个时候添加INotifyPropertyChanged,但我不认为这是阻止它在这里工
public interface IString
{
string String { get; set; }
}
public class Settings : IString
{
public string String { get; set; }
}
主窗口XAML:
<Window x:Class="WpfApp1.MainWindow">
<local:UserControl1 x:Name="TheUserControl"/>
</Window>
UserControl1 XAML:
<UserControl x:Class="WpfApp1.UserControl1"
<TextBox DataContext="Settings" Text="{Binding String}"/>
</UserControl>
您要做的是使
UserControl
中的属性可以从main窗口绑定。要做到这一点,就要让它成为一件好事。此外,正如@Clemens所建议的,您可以添加一个属性CHANGED回调,以便在属性更改时执行其他代码。此外,您还可以设置默认属性并配置其他回调
然后在main窗口中
<Window x:Class="WpfApp1.MainWindow">
<local:UserControl1 x:Name="TheUserControl" Settings="{Binding xyz}"/>
</Window>
您可以将设置读入适当的视图模型,并允许数据上下文在窗口及其子窗口中流动。您可以将设置设置为可绑定属性,并在使用MainWindow上的控件时进行设置。在UserControl中声明a并将其绑定到settings类的String属性。类似这样:您应该使用PropertyChangedCalback来完成此操作。否则OP可能会向设置设置程序添加代码,并想知道为什么它从未被调用。@Clemens great point,Edited这对我不起作用。xyz是设置的实例还是设置的字符串属性?否xyz
是您要绑定到的内容,即您需要填写的部分。
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}
public IString Settings { get; set; }
}
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}
public static readonly DependencyProperty SettingsProperty
= DependencyProperty.Register("Settings", typeof(string), typeof(UserControl1),
new PropertyMetadata(
"DefaultSetting",
new PropertyChangedCallback(OnSettingsChanged)));
public string Settings
{
get { return (string)GetValue(SettingsProperty); }
set { SetValue(SettingsProperty, value); }
}
private static void OnSettingsChanged(
DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var control = (UserControl1)d;
var newSettings = (string)e.NewValue;
//Optionally do something when Settings changed
}
}
<Window x:Class="WpfApp1.MainWindow">
<local:UserControl1 x:Name="TheUserControl" Settings="{Binding xyz}"/>
</Window>