如何将自定义控件的控件模板内定义的元素绑定到子类(自定义控件类)中定义的属性

时间:2014-06-30 18:05:19

标签: c# wpf mvvm custom-controls

我想将自定义控件的控件模板中的元素绑定到在自定义控件类中定义的子类中定义的属性。这样做的语法可能是什么(see {Binding ???})?

一些代码......

C#代码:

public class CustmCntrl : Control
{
  // blablabla

   public class SubChildClass: INotifyPropertyChanged
   {
        public double X { get; private set; }
        public string info { get; private set; }
   }
}

XAML:

<Style TargetType="{x:Type local:CustmCntrl}">

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustmCntrl}">

                <Grid> ... </Grid>

                <ItemsControl 
                       ItemsSource="{Binding stuffToDisplay, RelativeSource={RelativeSource TemplatedParent}}">

                       <ItemsControl.ItemsPanel>
                             <ItemsPanelTemplate >
                                 <Grid> ... </Grid>
                             </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>

                        <ItemsControl.ItemTemplate>
                             <DataTemplate>
                                  <local:X
                                        ToolTip="{Binding info ???}">
                                        <local:X.RenderTransform>
                                            <TranslateTransform X="{Binding X ???}"/>
                                        </local:X.RenderTransform>
                                  </local:X>
                             </DataTemplate>
                        </ItemsControl.ItemTemplate>
                </ItemsControl>

1 个答案:

答案 0 :(得分:2)

我目前无法对此进行测试,但您应该可以通过添加SubChildClass类的名称进行绑定。尝试这样的事情:

 <TextBlock Text="{Binding SubChildClass.PropertyName, RelativeSource={RelativeSource 
     AncestorType={x:Type YourPrefix:YourCustomControl}}}">

如果这不起作用,请尝试:

 <TextBlock Text="{Binding (SubChildClass.PropertyName), RelativeSource={RelativeSource
     AncestorType={x:Type YourPrefix:YourCustomControl}}}">

您可以在MSDN上的Property Path Syntax页面上找到更多信息。


更新&gt;&gt;&gt;

是的,在有机会在一个项目中测试它之后,似乎你不能直接与类属性绑定数据。但是,如果您只是想将类声明为控件中某些基本数据项的容器,那么这很好。只要您定义了一些DependencyProperty来保存它们,就可以使用该类:

private static DependencyProperty ItemsProperty = DependencyProperty.Register("Items",
    typeof(ObservableCollection<SubChildClass>), typeof(CustomControl1));

public ObservableCollection<SubChildClass> Items
{
    get { return (ObservableCollection<SubChildClass>)GetValue(ItemsProperty); }
    set { SetValue(ItemsProperty, value); }
}

Generic.xaml

<ListBox ItemsSource="{Binding Items, 
    RelativeSource={RelativeSource AncestorType={x:Type local:CustmCntrl}}}" />