2013-03-19 2 views
6

, 나는 설명하기 위해 최선을 다할 것입니다 (그리드 타사 회사에 속해 하지만여러 데이터 컨텍스트 MVVM 나는 내 질문에 헤더가 정확히 내 문제를 나타낼 경우 확실하지 오전

<DataTemplate> 
    <TextBlock> 
     <Hyperlink Command="{Binding OpenLinkCommand}"> 
      <Hyperlink.ToolTip> 
       <TextBlock Text="{Binding Data.MapLink}"/> 
      </Hyperlink.ToolTip> 
      <TextBlock Text="{Binding Data.MapLink}" TextDecorations="underline"> 
     </Hyperlink> 
    </TextBlock> 
</DataTemplate> 

좀 하이퍼 링크 ("Data.MapLink"를 표시하려면이 DataTemplate을 만들 원하는 링크 값을 포함하는 객체)와 화재 것이 링크를 클릭 할 때마다입니다) 내 질문에 대한 그것은`중요하지 명령 "OpenLinkCommand".

문제는 "Data.MapLink가"와 "OpenLinkCommand"서로 다른 데이터 컨텍스트에있는 것입니다 후 나는 다음 선택 사항 중 하나를 선택해야합니다 : 그것은 같은

  1. 휴가 하이퍼 링크 데이터 컨텍스트를 - 명령 원 하이퍼 링크는 Data.MapLink 값을 가져옵니다.

  2. datacontext 명령으로 하이퍼 링크 dataContext 변경 - 명령이 작동하지만 하이퍼 링크 이름이 비어 있습니다.

은 유감스럽게도 나는 그것을 데이터 컨텍스트는 "X가"라는 명령을 말과 데이터 컨텍스트는 "Y"라는 하이퍼 링크를 이야기하는 방법을 방법을 찾아야하므로 옵션은 동일한 데이터 컨텍스트에서 해당 항목을 넣어 가지고 돈`t.

제 질문이 분명하기를 바랍니다. 어떻게이 문제를 해결할 수 있습니까?

+1

두 번째 datacontext는 어디서 오는가? 요소에 datacontext 요소를 바인딩하고 상대 소스를 설정하기 만하면 요소에 바인딩됩니까? 뷰 모델에서 두 datacontext에 대한 액세스 권한이있는 경우 (뷰 모델을 사용한다고 가정) 다른 명령을 가져올 수 있습니다. – TYY

+0

바인딩에서 RelativeSource를 사용하여 올바른 datacontext를 찾으십시오. – blindmeis

+0

방금 ​​Microsoft에 버그를보고했습니다 (https://connect.microsoft.com/VisualStudio/feedback/details/1398835/binding-of-readonly-dependencyproperty). –

답변

15

당신이 당신의 기본보다 바인딩에 대해 다른 Source를 지정하는 데 사용할 수있는 몇 가지 바인딩의 숙소 중 한 곳입니다 DataContext

가장 일반적인 것들은 ElementName 또는 RelativeSource입니다. VisualTree에서 다른 UI 요소를 찾아서 속성에 바인딩 할 수 있습니다.예를 들어

는, 다음은이 바인딩 소스로 MyGridView를 사용해야하고, 또한 더 객체를 찾기 위해 바인딩에 RelativeSource을 사용할 수 있습니다 MyGridView.DataContext.OpenLinkCommand

<Hyperlink Command="{Binding ElementName=MyGridView, 
          Path=DataContext.OpenLinkCommand}"> 

에 결합하는 것을 바인딩 알려 ElementName을 사용하여 지정된 오브젝트 유형의 VisualTree를 시작하여 바인딩 소스로 사용하십시오. 이 예는 ElementName 대신 RelativeSource을 사용한다는 것을 제외하고 위의 예와 동일한 작업을 수행하므로 GridViewName이 지정되어 있지 않아도됩니다.

<Hyperlink Command="{Binding 
       RelativeSource={RelativeSource AncestorType={x:Type GridView}}, 
       Path=DataContext.OpenLinkCommand}"> 

세 번째 옵션은 다음과 같이 정적 객체에의 바인딩 Source 속성을 설정하는 것입니다

<Hyperlink Command="{Binding 
       Source={x:Static local:MyStaticClass.OpenLinkCommand}}"> 

싱글 바인딩에 대해 your comment here을 바탕으로, 이것은 아마도 당신을위한 최선의 선택이 될 것입니다 .

+0

안녕하세요, 귀하의 솔루션이 내가 원하는 것 같습니다. 나는 오늘 그것을 시험해보고 그것이 내 문제를 해결했는지보고 할 것이다. – Ofir

+0

솔루션은 훌륭하게 작동합니다! 감사합니다. – Ofir

+0

@Ofir 당신을 위해 일해 준 다행 :) – Rachel

0

원하는 데이터 컨텍스트 (일반적으로 컨트롤 또는 창 리소스)의 인스턴스가 있어야합니다. 일단 부모 데이터 컨텍스트를 자동으로 상속하는 대신 텍스트 블록의 데이터 컨텍스트를 명시 적으로 설정할 수 있어야합니다. 예를 들어

: 당신은 정말 여분의 데이터 컨텍스트에 대한 다른 속성을 사용해야하는 경우

<TextBlock DataContext="{StaticResource MyDataMapLinkDataContext}" Text="{Binding Data.MapLink}" TextDecorations="underline"/> 
+1

예 이런 식으로 생각했지만 다른 datacontext instace (내 datacontext는 singleTon이어야합니다)를 만들 수 없습니다. 다른 제안 사항이 있으십니까? – Ofir

+0

친척 소스 FindAncestor를 사용하여 부모 데이터 컨텍스트에 하이퍼 링크를 바인딩 할 수 있습니다. 정확한 바인딩 코드는 xaml을 구조화 한 방법에 따라 다릅니다. 어쩌면 이걸로 도움이 필요하면 xaml을 게시 할 수 있습니다. – failedprogramming

+0

또한 mvvm을 사용하는 경우 동일한 datacontext에 두 명령을 넣을 수는 없다고 했으므로 두 모델을 모두 세 번째 랩으로 감싸고 두 명령을 모두 표시 할 수 있습니다. – failedprogramming

0

다음은 연결된 속성을 사용할 수 있습니다.

XAML

<Window.Resources> 
     <Style TargetType="Button"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="Button"> 
         <ContentPresenter Content="{Binding (local:ExtraDataContextProvider.ExtraDataContext), RelativeSource={RelativeSource TemplatedParent}}"/> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Window.Resources> 

    <Grid> 
     <Button Margin="172,122,131,79" Foreground="Green" local:ExtraDataContextProvider.ExtraDataContext="A test"> 
      test 
     </Button> 
    </Grid> 
</Window> 

코드

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace WpfApplication1 
{ 

    public class ExtraDataContextProvider : DependencyObject 
    { 
     public static object GetExtraDataContext(DependencyObject obj) 
     { 
      return (object)obj.GetValue(ExtraDataContextProperty); 
     } 

     public static void SetExtraDataContext(DependencyObject obj, object value) 
     { 
      obj.SetValue(ExtraDataContextProperty, value); 
     } 

     public static readonly DependencyProperty ExtraDataContextProperty = DependencyProperty.RegisterAttached("ExtraDataContext", typeof(object), typeof(ExtraDataContextProvider), new PropertyMetadata(null)); 
    } 

    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 
    } 
}