C# 如何将UserControl中控件的属性绑定到包含它的窗口的属性?

C# 如何将UserControl中控件的属性绑定到包含它的窗口的属性?,c#,.net,wpf,data-binding,C#,.net,Wpf,Data Binding,我有一个主窗口。它包含一个带有文本框的UserControl1实例。MainWindow还包含设置类的实例。我想将TextBox绑定到Settings类的string属性 困难在于UserControl1不了解MainWindow或设置(因为我想在多个项目中使用UserControl1)。所以我制作了一个接口IString,并将其传递给UserControl1。然而,我仍然无法获得任何工作绑定。我意识到我必须在某个时候添加INotifyPropertyChanged,但我不认为这是阻止它在这里工

我有一个主窗口。它包含一个带有文本框的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>