2015-09-14 2 views
0

Я просмотрел InterWebs достаточно! Я надеюсь на решение этой проблемы.
У меня есть два родительских UserControls, ParentUc1 и ParentUc2. Они оба включают ChildUc.WPF - Установить привязку в Child UserControl от родителей чистым XAML

Без добавления кода, кроме кода XAML, я хотел бы установить значения привязки SensorRotationAngle в ChildUc от каждого из родителей.

ParentUc1:
Набор SensorRotationAngle до 10
ParentUc2:
Набор SensorRotationAngle 20

ChildUc:

<Rectangle> 
    <Rectangle.RenderTransform> 
     <RotateTransform Angle="{Binding SensorRotationAngle}" /> 
    </Rectangle.RenderTransform> 
</Rectangle> 

Спасибо!

ответ

1

Поскольку ваше дочернее пользовательское управление получает значение от привязки к свойству SensorRotationAngle, вам необходимо убедиться, что класс DataContext, который установлен на вашем ChildUc, обладает таким свойством.

Таким образом, вы можете создать свой дочерний элемент управления, как это, непосредственно создании экземпляра модели представления и установить значение SensorRotationAngle в процессе:

<ChildUc> 
    <ChildUc.DataContext> 
    <ChildUcViewModel SensorRotationAngle="30"></ChildUcViewModel> 
    </ChildUc.DataContext> 
</ChildUc> 

Сам вид модели может, как это:

public class ChildUcViewModel : INotifyPropertyChanged 
{ 
    public int SensorRotationAngle 
    { 
     get 
     { 
      return _sensorRotationAngle; 
     } 
     set 
     { 
      if (_sensorRotationAngle != value) 
      { 
       _sensorRotationAngle = value; 
       OnPropertyChanged(); 
      } 
     } 
    } 
    int _sensorRotationAngle; 



    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

Я только что испытал это на своей системе, он работает.

+0

спасибо Мата, он работал как шарм! –

+0

Добро пожаловать :-) – Martin

0

Я считаю, что это случай использования силы наследования Value из DependencyProperty.

В принципе, childcontrol наследует значение от родительского значения SensorRotationAngle напрямую.

public class ParentControlGrid : Grid 
{ 
    // Dependency Property 
    public static readonly DependencyProperty SensorRotationAngleProperty = 
     DependencyProperty.Register("SensorRotationAngle", typeof(int), 
     typeof(ParentControlGrid), new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.Inherits)); 

    // .NET Property wrapper 
    public int SensorRotationAngle 
    { 
     get { return (int)GetValue(SensorRotationAngleProperty); } 
     set { SetValue(SensorRotationAngleProperty, value); } 
    } 
} 

public class ChildControlTextBox : TextBox 
{ 
    // Dependency Property 
    public static readonly DependencyProperty SensorRotationAngleProperty; 

    static ChildControlTextBox() 
    { 
     SensorRotationAngleProperty = ParentControlGrid.SensorRotationAngleProperty.AddOwner(typeof(ChildControlTextBox), 
      new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.Inherits)); 
    } 

    // .NET Property wrapper 
    public int SensorRotationAngle 
    { 
     get { return (int)GetValue(SensorRotationAngleProperty); } 
     set { SetValue(SensorRotationAngleProperty, value); } 
    }   
} 

<Window x:Class="WpfTestProj.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:wpfTestProj="clr-namespace:WpfTestProj"   
    Title="MainWindow" Height="350" Width="525"> 
<wpfTestProj:ParentControlGrid SensorRotationAngle="500"> 
    <wpfTestProj:ChildControlTextBox Text="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=SensorRotationAngle}" /> 
</wpfTestProj:ParentControlGrid> 

Смежные вопросы