2010-08-12 4 views
3

내가 만든 UserControl에 twoway 바인딩을 설정하려고합니다. TwoWay UserControl과 바인딩

I은 ​​XAML에서의 제어를 사용

<uc:MyUserControl DataContext="{Binding Path=MyObject, Mode=TwoWay}" /> 

나의 사용자 제어 데이터가 표시된 다음 ....

<UserControl x:Class="SilverlightApplication1.XText" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="400"> 

    <Grid x:Name="LayoutRoot" Background="White"> 
     <TextBox x:Name="Text" Text="{Binding}"/> 

    </Grid> 
</UserControl> 

로 정의 ...과 같이 DataContext를 설정되고 올바르게, 그러나 나는 내가 TwoWay 바인딩으로 업데이트하기를 바랬다.

아래에서 시도했지만 경로가 정의되지 않았기 때문에 런타임에 오류가 발생합니다.

<Grid x:Name="LayoutRoot" Background="White"> 
     <TextBox x:Name="Text" Text="{Binding Mode=TwoWay}"/> 

    </Grid> 
</UserControl> 

DataContext를 바인딩을 양방향 할 수있는 UserControl을 내부 컨트롤을하는 방법에 어떤 아이디어? .... 나는이 작업을 얻을 수있는 방법을 마련 있다고 생각

답변

1

기본 컨트롤에 이름을 지정하지 않아도되는 해결책을 발견했습니다. 기본 UserControl의 이름을 정의 할 때 동일한 이름으로 정의 되었기 때문에 여러 인스턴스를 내 Grid에 추가 할 때 문제가 발생했습니다.

이것은 내 첫 번째 답변과 더그의 답변을 조합 한 것입니다. 참고 UserControl을 이름 속성을 결여하고 텍스트 상자는 더는 XAML에 선언 바인딩이 없습니다

XAML

<UserControl 
    x:Class="SilverlightApplication1.XText" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    d:DesignHeight="300" 
    d:DesignWidth="400"> 

    <Grid x:Name="LayoutRoot" Background="White"> 
     <TextBox x:Name="MyText"/>  
    </Grid> 
</UserControl> 

코드 숨김

public partial class XText 
{ 
    public XText() 
    { 
     InitializeComponent(); 
     MyText.SetBinding(TextBox.TextProperty, new Binding() 
     { 
      Source = this, 
      Path = new PropertyPath("Value"), 
      Mode = BindingMode.TwoWay 
     }); 
    } 


    public static DependencyProperty ValueProperty = 
     DependencyProperty.Register(
      "Value", 
      typeof(string), 
      typeof(XText), 
      new PropertyMetadata(null) 
     ); 

    public string Value 
    { 
     get { return ((string)(GetValue(ValueProperty))); } 
     set { SetValue(ValueProperty, value); } 
    } 

    ... 
} 

당신이 그것을 어떻게 사용할 준비가 다음

<uc:XText Value="{Binding Path=MyObject, Mode=TwoWay}" /> 
+0

MyText.SetBinding() 청크는 여전히 다소 해킹입니다. 나는 그것을 사용하는 것이 그것이 가치있는 것보다 훨씬 더 문제가된다는 것을 알게 될 것이라고 생각합니다. – Doug

0

확인

먼저 나는에 그런 뒤에 내 UserControl을의 코드에서 공용 속성 ...

public Binding BindingValue 
{ 
    set { this.MyTextBox.SetBinding(TextBox.TextProperty, value); } 
} 

설정 XAML

<uc:MyUserControl BindingValue="{Binding Path=MyObject, Mode=TwoWay}" /> 
2

위의 (자체 응답) 답변으로 문제가 해결 된 것으로 보이지만 문제가되는 도메인 문제라고 생각합니다. 나는 어려움을 겪고 있습니다. 을 처음부터 직접 바인딩하고 싶습니다. 특히 데이터가 어떻게되는지에 대한 제어력이 떨어 지므로 특히 그렇습니다. 코드 숨김에서 다음

<UserControl 
    x:Class="SilverlightApplication1.XText" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    x:Name="UserControl" 
    d:DesignHeight="300" 
    d:DesignWidth="400"> 

    <Grid x:Name="LayoutRoot" Background="White"> 
     <TextBox x:Name="Text" Text="{Binding Path=Value, ElementName=UserControl, Mode=TwoWay}"/>  
    </Grid> 
</UserControl> 

: 다음

public partial class XText 
{ 
    public static DependencyProperty ValueProperty = 
     DependencyProperty.Register(
      "Value", 
      typeof(string), 
      typeof(XText), 
      new FrameworkPropertyMetadata(null) 
     ); 

    public string Value 
    { 
     get { return ((string)(base.GetValue(XText.ValueProperty))); } 
     set { base.SetValue(XText.ValueProperty, value); } 
    } 

    ... 
} 

, 당신이 그것을 사용할 준비가되었을 때 :

<uc:XText Value="{Binding Path=MyObject, Mode=TwoWay}" /> 

예, 그것은 더 많은 코드의를

는 다음 가져 하지만 UserControl 내부에 Value이 발생하는 상황을 훨씬 더 효과적으로 제어 할 수 있습니다. 앞으로이 코드를 사용하면 훨씬 간단하게 작업 할 수 있습니다.

생각하십니까?

-doug

편집 : 몇 가지 오타가 수정되었습니다.

+0

흥미로운 접근 방법을 시도해 보겠습니다. – Gabe

+0

내가 눈치 채는 한 가지는 임의로이 사용자 정의 컨트롤을 그리드에 추가 할 때 오류가 발생합니다. 이 두 사용자 컨트롤을 사용하는 경우 "값이 예상되는 범위 내에 들지 않습니다"라는 오류가 발생합니다 ... 디버깅을 계속하면 파서 오류가 발생합니다. "UserControl이 이미 트리에 있음"이라고합니다. 위와 같이 UserControl에서 문제가 발생합니까? 실제로 UserControl의 인스턴스를 만들 때 이름을 전혀 지정하지 않습니다. 하지만 당신처럼 UserControl의 UserControl 안에 UserControl이라는 이름을 붙였습니다. 그래서 ElementName을 Bind에 사용할 수 있습니다. – Gabe

+0

모든 UserControls의 이름을 지정했지만이 문제는 결코 경험하지 못했습니다. UserControl의 이름을 지정할 때는 컨트롤 자체의 이름 범위 내에서만 적용됩니다. 따라서 동일한 컨트롤을 페이지에 여러 번 사용하면 명명 충돌이 발생하지 않습니다. 문제는 내가 당신에게 준 코드가 아니라 어딘가에서 구현 한 것이라고 생각합니다. – Doug

관련 문제