2009-06-08 6 views
0

Ich habe versucht, meine generische ReadOnlyCheckBox Stil/Vorlage zu erstellen, aber ich habe ein Problem mit der Bindung an die Daten. Im Beispiel hier:ReadOnlyCheckBox ControlTemplate

A read-only CheckBox in C# WPF

Sie direkt auf die Daten aus der Control Definition binden, aber das ist natürlich nicht wirklich, was ich will, wie ich die neue Checkbox zu erklären, so etwas wie dies in der Lage sein wollen :

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

Außer natürlich, wenn ich dies tun und dann den Ereignisauslöser auf der Kugel ein Template von IsChecked ich genau haben zu sein, was mit ich begann! Ich denke, ich verstehe nicht, warum das Festlegen der Bindung direkt im Bullet unterscheidet sich von der Einstellung IsChecked und die Bindung an das, ist das TemplateBinding nicht nur eine Möglichkeit zum Verweisen, was in den Eigenschaften des Steuerelements erstellt wird? Wie löst der Click das UI-Update aus, obwohl die Daten nicht aktualisiert werden? Gibt es einen Auslöser für Click, den ich überschreiben kann, um das Update zu stoppen?

Ich habe alle DictionaryRessource Sachen funktioniert gut, so bin ich glücklich damit, Prost für den Zeiger. Die andere Sache, auf die ich neugierig war, war, ob es möglich ist, meine Control/Style-Vorlage durch Verwendung des BasedOn-Parameters im Stil zu reduzieren, dann würde ich nur die Dinge außer Kraft setzen, die ich wirklich ändern muss, anstatt viel zu deklarieren Dinge, von denen ich denke, dass sie sowieso Teil der Standardvorlage sind. Ich könnte damit spielen.

Prost

ed

Antwort

0

Das Problem, das Sie in laufen, ist, dass Sie versuchen, Datenbindung zu verwenden, wo sollten Sie nicht.

Ich stimme nicht mit anderen Antworten überein, die Sie in dem von Ihnen geposteten Link erhalten haben. Während die ControlTemplate-Lösungen ordentlich und ordentlich erscheinen, kommen sie nicht in den Mittelpunkt Ihres Problems, dh Sie versuchen, ein einzelnes Steuerelement (eine CheckBox) zu verwenden, um zwei verschiedene Dinge zu tun: Status anzeigen (z. B. aktiviert/deaktiviert)) und Logik ausführen (Remote-Gerät usw.).

Control sind entworfen, um die Art und Weise eine Steuer zu ändern scheint, aber verhält sich nicht. Sie versuchen, das Verhalten zu ändern, nicht das Aussehen. Siehe "Was ist ein ControlTemplate?" here für mehr Details

, das zu tun, dann werden Sie einige Ereignisse einige verzichten den Standard verbindlich und Griff haben, zu speichern:

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> 

-Code-Behind:

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; 
     } 

    } 
} 

Das obige Codebeispiel gibt Ihnen die Möglichkeit, etwas Code async über BackgroundWorker auszuführen - Ich habe ein Thread.Sleep als Platzhalter eingefügt. Ich benutze auch foo.IsEnabled als Sentinel-Wert in foo_Checked, aber du brauchst vielleicht einen extra Status, um alle deine Fälle zu behandeln (zum Beispiel von Checked zu Unchecked).

+0

Hallo Micahtan, Vielen Dank für Ihre Antwort, es tut mir leid, dass es so lange gedauert hat, um zu Ihnen zurück zu kommen, aber ich wurde auf ein dringendes Projekt gezogen, das beendet werden musste. Obwohl Ihre Antwort könnte definitiv funktionieren, es fühlt sich nicht so elegant zu mir, wie die Checkbox selbst überprüft und dann bei der Handhabung der Checked-Ereignis setzen wir es zurück, wenn Sie die Schaltfläche beim Klicken Sie sehen die Prüfung angezeigt und dann verschwinden nochmal. Idealerweise möchte ich die Vorlage bearbeiten können, um die Überprüfung zu deaktivieren, wenn der Klick auftritt, so dass es nur passiert, wenn ich es setze, oder die gebundene Variable einen neuen Wert annimmt. prost ed – EdWaugh

+0

Hallo jemand auf diesen Thread, ich mein Problem Kontrolle durch Erstellen einer benutzerdefinierten gelöst basierend auf den Knopf finden Sie hier: http://stackoverflow.com/questions/1088906/adding-a-custom-dependency- Eigenschaft-zu-Kontrolle-Vorlage-in-Xaml Ed – EdWaugh

Verwandte Themen