在usercontrol之间共享依赖属性

时间:2017-10-03 08:16:45

标签: c# mvvm user-controls dependency-properties

我试图在不使用任何MVVM框架的情况下构建MVVM应用程序。 我已经定义了我的主窗口和视图模型,appcontroller,一些视图(UserControl一般建议),它们显示在主窗口面板中,通过使用包含常用样式的另一个usercontrol的合成来共享相同的外观和感觉,到目前为止一切顺利。

我的问题是:我希望我的所有观点和#34;对象"共享几个依赖属性(查看标题,帮助上下文等)。

问题是:你不能把相同的DP名称放到几个对象上,你不能 在设计模式下修改从usercontrol继承的东西(VS设计师似乎只能识别Window,UserControl和Page对象)

我认为我在这里错过了一些东西,但不能把手指放在上面。你能救我吗?

1 个答案:

答案 0 :(得分:0)

终于通过了它。

  • 声明一个从usercontrol继承的控件(仅限cs文件,没有xaml)

    public class BaseView : UserControl
    {
    
    
        public string Title
        {
            get { return (string)GetValue(TitleProperty); }
            set { SetValue(TitleProperty, value); }
        }
    
        // Using a DependencyProperty as the backing store for Title.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TitleProperty =
            DependencyProperty.Register("Title", typeof(string), typeof(BaseView), new PropertyMetadata("New view"));
    
        public BaseView()
        {
    
        }
    }
    
  • 在此控件的全局资源中声明样式:

    <Style TargetType="{x:Type views:BaseView}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type views:BaseView}">
                    <Border CornerRadius="5"  BorderThickness="2">
                        <Grid Name="RootGrid">
                            <ContentPresenter></ContentPresenter>
                        </Grid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    
  • 在您可以将BaseView控件子类化为另一个控件之后:

    <local:BaseView x:Class="MyNS.NiceView"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 mc:Ignorable="d" 
                 Title="My Software"
                 d:DesignHeight="300" d:DesignWidth="300">
        <Grid>
        <StackPanel>
            <Button>HAAAAhahahaha</Button>
            <Label>213456789</Label>
        </StackPanel>        
    </Grid>
    </local:BaseView>