2009-06-08 5 views
0

일반 ReadOnlyCheckBox 스타일/템플릿을 만들려고했지만 데이터 바인딩 문제가 있습니다. 여기 예제에서ReadOnlyCheckBox ControlTemplate

A read-only CheckBox in C# WPF

당신은 ControlTemplate에 정의의 데이터에 직접 결합,하지만이 같은 새로운 확인란 뭔가를 선언 할 수 있도록 원하는 물론 이것은, 내가 원하는 걸 정말 아니다 : 물론 제외

 <CheckBox x:Name="uiComboBox" Content="Does not set the backing property, but responds to it." 
Style="{StaticResource ReadOnlyCheckBoxStyle}" IsChecked="{Binding MyBoolean}" Click="uiComboBox_Click"/> 

나는이 작업을 수행 한 후 내가 정확히 내가 시작 한 내용의 IsChecked의 TemplateBinding로 총알의 이벤트 트리거를 설정할 때! 나는 총알에서 바인딩을 직접 설정하는 것이 IsChecked를 설정하고 바인딩하는 것과 다른 이유를 이해하지 못한다. TemplateBinding은 생성되는 컨트롤의 속성에 설정된 것을 참조하는 방법이 아닌가? 데이터가 업데이트되지 않아도 UI 업데이트를 트리거하는 클릭은 어떻게 발생합니까? 업데이트를 중지하기 위해 무시할 수있는 클릭에 대한 트리거가 있습니까?

저는 DictionaryResource의 모든 항목이 잘 작동하므로 포인터에 대한 환호성에 만족합니다.

다른 점은 스타일에 BasedOn 매개 변수를 사용하여 내 Control/Style 템플릿을 줄일 수 있다면 많은 것을 선언하는 대신 실제로 변경해야하는 사항을 재정의하는 것입니다. 어쨌든 표준 템플릿의 일부라고 생각하는 것들. 나는 이것에 연극을할지 모른다.

건배

에드

답변

0

당신이로 실행중인 문제는 당신이 어디 안 데이터 바인딩을 사용하려는 것입니다.

나는 게시 한 링크에서 얻은 다른 답변에 동의하지 않습니다. ControlTemplate 솔루션이 깔끔하고 깔끔하게 보이지만 문제의 핵심에 도달하지 못합니다. 즉, 하나의 컨트롤 (CheckBox)을 사용하여 두 가지 작업을 수행하려고합니다. 상태 표시 (예 : 체크/체크하지 않음)) 및 논리 (원격 장치 등)를 수행합니다.

ControlTemplates는 으로 표시되는 방식을 변경하지만 은 표시하지 않으므로으로 변경됩니다. 외모가 아닌 행동을 바꾸려고합니다. "ControlTemplate이란?"을 참조하십시오.

XAML :

<Window x:Class="WPFCheckBoxClickTester.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <CheckBox x:Name="foo" Checked="foo_Checked"></CheckBox> 
    </Grid> 
</Window> 

코드 숨김 :

자세한 내용

그렇게하기위한 here, 당신은 몇 가지 이벤트를 일부 바인딩 표준을 지내다 저장하고 처리해야 할거야

using System.ComponentModel; 
using System.Threading; 
using System.Windows; 

namespace WPFCheckBoxClickTester 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     private BackgroundWorker _worker = new BackgroundWorker(); 

     public Window1() 
     { 
      InitializeComponent(); 

      foo.IsThreeState = false; 
      this._worker.DoWork += new DoWorkEventHandler(_worker_DoWork); 
      this._worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_worker_RunWorkerCompleted); 
     } 

     private void _worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      foo.IsChecked = true; 
      foo.IsEnabled = true; 
      return; 
     } 

     private void _worker_DoWork(object sender, DoWorkEventArgs e) 
     { 
      Thread.Sleep(500); 
      return; 
     } 

     private void foo_Checked(object sender, RoutedEventArgs e) 
     { 
      if(foo.IsChecked == true && this.foo.IsEnabled) 
      { 
       this.foo.IsChecked = false; 
       this.foo.IsEnabled = false; 

       this._worker.RunWorkerAsync(); 
      } 
      return; 
     } 

    } 
} 

위의 코드 예제는 BackgroundWorker를 통해 일부 코드 비동기를 실행할 수있는 기능을 제공합니다. Thread.Sleep을 자리 표시 자로 넣었습니다. 또한 foo.IsEnabled를 foo_Checked에서 감시 가치로 사용하고 있지만 모든 사례를 처리하기 위해 여기에 추가 상태가 필요할 수 있습니다 (예 : 선택에서 선택 취소로 이동).

+0

안녕 Micahtan, 답장을 보내 주셔서 감사합니다. 오랫동안 저에게 다가 갔지만 오래 전부터 끝내야하는 긴급한 프로젝트로 옮겨졌습니다. 답을 확실히 할 수는 있지만 체크 박스가 스스로를 체크하고 체크 한 이벤트를 처리 할 때 나에게 우아함을 느끼지는 않지만 체크를 볼 수 있고 사라지는 것을 볼 수있는 버튼을 본다면 체크 된 이벤트를 다시 설정할 때 다시. 이상적으로는 클릭이 발생할 때 검사를 사용하지 않도록 템플릿을 편집하여 설정하거나 바인딩 된 변수가 새로운 값을 가져 오는 경우에만 발생하도록하고 싶습니다. 환호 이 스레드에서 – EdWaugh

+0

안녕하세요 사람이, 내가 버튼을 기반으로하는 사용자 지정 컨트롤을 만들어 내 문제를 해결 에드 여기를 참조 : http://stackoverflow.com/questions/1088906/adding-a-custom-dependency- 속성 대 제어 템플릿 템플릿 내 ed – EdWaugh

관련 문제