2016-04-26 2 views
0

Я хочу сделать то же самое, что и в предыдущем вопросе с 2011 года: Should binding to Path.Data property work?, но моя проблема в том, что я получил любую другую ошибку, и я не понимаю, ведьма. Я ищу реле, так как через просмотреть дни, что я делаю неправильно, но я должен быть слепым ...Связывание с Path.Data Свойство в UserControl

Generic.xaml:

<Style TargetType="{x:Type local:CustomControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:CustomControl}"> 
       <Border Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}"> 
        <Path Data="{Binding GeometryData}" x:Name="CurveGraph" Stroke = "Black" StrokeThickness = "2" Grid.RowSpan="4"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

CustomControl.cs:

public class CustomControl : Control  
{ 

static CustomControl() 
{ 
    DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl), new FrameworkPropertyMetadata(typeof(CustomControl))); 
    CustomControl tmp = new CustomControl(); 
    tmp.Build(); 
} 

public GeometryGroup Build() 
{ 
    var curve = new GeometryGroup(); 
    curve.Children.Add(new LineGeometry(new Point(0, 0), new Point(20, 20))); 
    curve.Children.Add(new LineGeometry(new Point(0, 20), new Point(20, 0))); 
    new CustomControl().GeometryData = curve; 
    return curve; 
} 

private GeometryGroup GeometryData 
{ 
    get { return (GeometryGroup)GetValue(GeometryDataProperty); } 
    set { SetValue(GeometryDataProperty, value); } 
    public static readonly DependencyProperty GeometryDataProperty = DependencyProperty.Register("GeometryData", typeof(GeometryGroup), typeof(CustomControl), new UIPropertyMetadata(new GeometryGroup())); 
} 

MainWindow .xaml:

<Grid> 
    <ctl:CustomControl x:Name="Curve"/> 
</Grid> 

Всё. Главный Window.xaml.cs получил свой конструктор. Но я действительно не знаю, в чем проблема. :(

ответ

0

Это не имеет никакого смысла, чтобы создать экземпляр временного CustomControl в (статический) конструктор класса и вызвать метод сборки, который устанавливает GeometryData на еще одного временного экземпляра.

Вместо этого добавьте конструктор экземпляра, инициализирует GeometryData на текущем экземпляре. Также сделайте GeometryData общественности.

public class CustomControl : Control 
{ 
    public static readonly DependencyProperty GeometryDataProperty = 
     DependencyProperty.Register(
      "GeometryData", typeof(GeometryGroup), typeof(CustomControl)); 

    public GeometryGroup GeometryData 
    { 
     get { return (GeometryGroup)GetValue(GeometryDataProperty); } 
     set { SetValue(GeometryDataProperty, value); } 
    } 

    static CustomControl() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl), 
      new FrameworkPropertyMetadata(typeof(CustomControl))); 
    } 

    public CustomControl() 
    { 
     Build(); 
    } 

    public void Build() 
    { 
     var curve = new GeometryGroup(); 
     curve.Children.Add(new LineGeometry(new Point(0, 0), new Point(20, 20))); 
     curve.Children.Add(new LineGeometry(new Point(0, 20), new Point(20, 0))); 
     GeometryData = curve; 
    } 
} 

Кроме того, что вы должны либо использовать в ControlTemplate

в

или указать источник привязки, как

<Path Data="{Binding GeometryData, RelativeSource={RelativeSource TemplatedParent}}" ... /> 
+0

временный экземпляр был только один из тысячи пытаются заставить его работать. Но я также попытался вызвать функцию построения из MainWindow.xaml.cs, и в этот момент она вызывается из тех же мгновений, не так ли? – Teroman

+0

См. Мое редактирование. Теперь сборка представляет собой метод открытого экземпляра, который можно вызвать в экземпляре CustomControl, например. в коде MainWindow. Таким образом, вы, вероятно, можете сохранить конструктор экземпляра. – Clemens