WPF-Benutzer control-binding-Problem

Dies sollte ein sehr einfacher Fall, aber ich bin den Haaren ziehen versucht, es zu erhalten zu arbeiten. Hier ist das setup:

Ich entwerfe eine app, die eine nur-lese-Modus und Bearbeiten-Modus einige Daten. Also ich habe einen Benutzer erstellt Steuerelement eine textbox und textblock, der an das gleiche (text -) Daten und sind bedingt sichtbar basierend auf EditableMode Eigenschaft (also, wenn es bearbeitbar ist das Textfeld angezeigt und wenn es nicht der textblock angezeigt wird)

Nun, ich möchte viele dieser Steuerelemente in meinem Hauptfenster haben, gebunden zu einem einzigen bool-Eigenschaft. Wenn diese Eigenschaft geändert wird, über einen button, ich möchte, dass alle Textblöcke zu biegen Sie in die Textfelder oder zurück.

Mein problem ist, dass die Steuerung richtig eingestellt ist auf die Bindung, und wenn ich myUserControl.Editable = true. Aber es ändert sich nicht, wenn die Bindung an eine bool-Eigenschaft.

Hier ist der code für meine Benutzer-Steuerung:

<UserControl x:Class="CustomerCareTool.Controls.EditableLabelControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:src="clr-namespace:CustomerCareTool.Converters"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<UserControl.Resources>
    <src:BoolToVisibility x:Key="boolToVisibility" Inverted="False" />
    <src:BoolToVisibility x:Key="invertedBoolToVisibility" Inverted="True" />
</UserControl.Resources>
<Grid>
    <TextBlock Name="textBlock" Text="{Binding Path=TextBoxValue}" Visibility="{Binding Path=EditableMode, Converter={StaticResource invertedBoolToVisibility}}"/>
    <TextBox Name="textBox" Visibility="{Binding Path=EditableMode, Converter={StaticResource boolToVisibility}}">
        <TextBox.Text>
            <Binding Path="TextBoxValue" UpdateSourceTrigger="PropertyChanged"/>
        </TextBox.Text>
    </TextBox>
</Grid>

Benutzte ich einen Konverter zum umwandeln boolescher Wert, der die Sichtbarkeit und die inverse bool Sichtbarkeit. Nicht sicher, ob das überhaupt hier gebraucht.

- Und das ist der code hinter:

public partial class EditableLabelControl : UserControl
{
    public EditableLabelControl()
    {
        InitializeComponent();
    }

    public string TextBoxValue
    {
        get { return (string)GetValue(TextBoxValueProperty); }
        set { SetValue(TextBoxValueProperty, value); }
    }

    public static readonly DependencyProperty TextBoxValueProperty =
        DependencyProperty.Register("TextBoxValue", typeof(string), typeof(EditableLabelControl), new UIPropertyMetadata());


    public bool EditableMode
    {
        get { return (bool)GetValue(EditableModeProperty); }
        set { SetValue(EditableModeProperty, value); }
    }

    public static readonly DependencyProperty EditableModeProperty =
        DependencyProperty.Register("EditableMode", typeof(bool),typeof(EditableLabelControl), new UIPropertyMetadata(false, EditableModePropertyCallBack));

static void EditableModePropertyCallBack(DependencyObject property,
DependencyPropertyChangedEventArgs args)
    {
        var editableLabelControl = (EditableLabelControl)property;
        var editMode = (bool)args.NewValue;

        if (editMode)
        {
            editableLabelControl.textBox.Visibility = Visibility.Visible;
            editableLabelControl.textBlock.Visibility = Visibility.Collapsed;
        }
        else
        {
            editableLabelControl.textBox.Visibility = Visibility.Collapsed;
            editableLabelControl.textBlock.Visibility = Visibility.Visible; 
        }
    }
}

Jetzt in meine main-Applikation habe ich das Steuerelement Hinzugefügt, wie hier:

<Controls:EditableLabelControl x:Name="testCtrl" EditableMode="{Binding Path=Editable}" TextBoxValue="John Smith" Grid.Row="0"/>

Für die gleiche Anwendung der DataContext gesetzt ist, um selbst

DataContext="{Binding RelativeSource={RelativeSource Self}}"

Ist und der code dahinter sieht wie folgt aus:

public partial class OrderInfoView : Window, INotifyPropertyChanged

{
    public OrderInfoView()
    {
        InitializeComponent();
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        Editable = !Editable;
    }

    private bool _editable = false;
    public bool Editable
    {
        get
        {
            return _editable;
        }
        set
        {
            _editable = value;
            OnPropertyChanged("Editable");
        }
    }

    protected virtual void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged == null) return;

        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }


    public event PropertyChangedEventHandler PropertyChanged;
}

Klicken auf die Schaltfläche, die nichts tut 🙁 ich habe alles versucht, diese zu arbeiten, und keine Würfel. Würde wirklich zu schätzen einige helfen!


Ich habe Folgendes versucht, und immer noch nicht funktioniert:

  public bool Editable
    {
        get { return (bool)GetValue(EditableProperty); }
        set { SetValue(EditableProperty, value); }
    }

    public static readonly DependencyProperty EditableProperty =
        DependencyProperty.Register("Editable", typeof(bool), typeof(OrderInfoView), new UIPropertyMetadata(false));
  • Ich würde empfehlen, zu brechen, das problem. Sind Sie sicher, dass Ihre Editierbare Bindung arbeiten? Um dies zu testen könntest du eine Kopie deines {Binding Path=Editable} verbindlich in einen normalen TextBlock, und sehen, ob die true und false wechseln, wenn die Schaltfläche geklickt wird. Wenn diese Bindung funktioniert, dann werfen Sie einen Haltepunkt in Ihrem EditableModePropertyCallBack-Methode, und stellen Sie sicher, dass getroffen wird. Wenn der Haltepunkt erreicht wird, dann Schritt für Schritt durch und stellen Sie sicher, dass es wie erwartet ausgeführt wird. Lassen Sie mich wissen, welche Ergebnisse Sie erhalten.
  • Ich werde give it a shot und poste ein update. Vielen Dank für die Hilfe!
InformationsquelleAutor Greg R | 2009-10-22
Schreibe einen Kommentar