WPF抽象通用UserControl与绑定

时间:2014-10-07 15:12:06

标签: c# .net wpf xaml data-binding

信息
我们正在处理.NET 4.0,WPF并试图将一些数据绑定到通用抽象基类。 我们的课程如下所示。这些类中的每一个都有一个公共的无参数构造函数,尽管我在这篇文章中将它们遗漏了。另请注意,类中的所有属性都将其setter扩展为封装 PropertyChanged 事件。这些也被省略,以使其更具可读性。

设置类

public abstract class BaseSettings : INotifyPropertyChanged
{
    public string Y { get; set; }
}
public class SomeSettings : BaseSettings
{
    // SomeOtherSettings : BaseSettings
    public SomeOtherSettings OTHER { get; set; }
}
public class SomeOtherSettings : BaseSettings
{
    public string X { get; set; }
}

用户控件

public abstract class BaseControl<S> : UserControl
    where S : BaseSettings, new()
{
    public S Settings
    {
        get { return (S)GetValue(SettingsProperty); }
        set { SetValue(SettingsProperty, value); }
    }
    public static readonly DependencyProperty SettingsProperty =
        DependencyProperty.Register("Settings", typeof(S), typeof(BaseControl<S>), new PropertyMetadata(null));
}
public partial class MyControl : BaseControl<SomeOtherSettings>
{
}
<m:BaseControl x:Class=ProperClassPathHere
               x:TypeArguments=s:SomeSettings
               xmlns:s=ProperClassPathToSomeSettingsHere />

    <TextBox Text={Binding Settings.X, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged} />

</m:BaseControl>

主窗口

public partial class MainWindow : Window
{
    public SomeSettings SomeSettings { get; set; }
}
<Window x:Class=ProperClassPathHere />

   <u:MyControl Settings={Binding Settings.OTHER} />

</Window>

问题
我们能够在MainWindow中绑定Settings.OTHER,但MyControl的DataContext应该与MainWindow不同。因此,我们永远不会在文本框中看到X的值...

另请注意:

  • 由于有一个抽象的父类,我们不能在这里使用x:Name属性
  • 如果我们自己在MyControl上设置DateContext,MainWindow就不能再绑定Settings.OTHER了。

我们在这里缺少什么?甚至有解决这个问题的方法吗?任何见解都将不胜感激。

0 个答案:

没有答案