2013-04-12 2 views
0

TextBlock의 Text 속성을 일부 요소 및 일부 모델의 속성에 바인딩하려고합니다. 이런 식으로 뭔가 :WPF TextBlock MultiBinding

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding> 
      <Binding ElementName="myElement1" Mode="OneWay" Path="Text" /> 
      <Binding ElementName="myElement2" Mode="OneWay" Path="Text" /> 
      <Binding Mode="OneWay" Path="Property1" /> 
      <Binding Mode="OneWay" Path="Property2" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

TextBlock입니다은 텍스트 값, myElement1, myElement2 및 속성 1, Property2의 조합을 가지고있다. 문제가 없습니다. 텍스트 값이 성공적으로 생성됩니다. 코드없이,

내가 다른 모델의 속성에있는 TextBlock의 전체 (결합) 텍스트 값을 바인딩 할 수 있습니다, 즉 Property3 : 여기

내 질문입니까?

+1

MVVM을 사용하는 경우이 상황에 스스로를 대비시켜야한다고 생각하지 않습니다. 뷰 모델은 이러한 항목을 개별적으로 노출하고 바인딩해야하며 연결된 데이터를 제공하기 위해 뷰에 의존하지 않아야합니다. 보기는 멀티 바인딩을 사용하여 다양한 형식의 데이터를 "표시"해야하지만 데이터를 모아 다시보기 모델에 제공하는 것과 다릅니다. View가 더 이상 데이터의 발표자가 아닌 그러한 구현에서는 책임의 분리가 사라집니다. – Viv

+0

네, Viv와 완전히 동의합니다. 이것은 당신이보기를 바라는 어떤 것이 아닙니다. 모델은 연결된 데이터를 속성으로 표시해야합니다 (뷰에서 라운드로 가져 오지 않음). – Ricibob

답변

0

어쨌든 첨부 된 속성 및 기타 바인딩을 설정하기 위해 일부 코드를 작성해야하는 해킹이 없어도 괜찮습니다. 문제는 바인딩에 2 개의 끝, 즉 대상과 원본이 있다는 것입니다. 대상 (바인딩이 설정된 위치)은 DependencyProperty 여야하므로 모델이 수행하려는 바인딩의 소스 끝에 있어야합니다. 이것은 TwoWay와 OneWayToSource 바인딩이 이것을 잘 수행하기 때문에 값을 설정하는 한 문제가되지 않습니다.

값이 (TextBlock.Text)에서 오는 원래 위치에 이미 바인딩이 할당되어 있으므로 모델 바인딩의 대상이 될 수 없다는 점에서 더 큰 문제가 있습니다. 다음으로 다른 UIElement 속성을 중개자로 사용하여 Text 값을 가져 와서 모델로 푸시하려고 할 수 있습니다. 이렇게하려면 다시 모델이 소스이고 다른 UIElement 속성이 대상이되어야합니다. 그러나 동일한 속성은 추출하려는 원본 Text 속성에 대한 바인딩의 대상이되어야하므로 다시 붙어 있습니다.

중요한 점은 XAML에서 설정 한 내용을 강제로 모델링하고 ViewModel 레이어에서 처리하는 것이 훨씬 낫다는 것입니다.

+0

고맙습니다. 나는 똑같은 생각을했지만, "있을지도 모른다"는 접근 방식이 있기 때문에 물었다. 나는이 필드를 http put/http post 요청 직전에 TextBlock의 text 속성에 할당하여이 문제를 해결했습니다. – kizanlik