2016-07-28 15 views
1

Dies ist ein vereinfachtes Beispiel. Ich habe eine Benutzersteuerung, die eine "Browse zu Ordner" -Funktion enthält, mit einem Textfeld und einer Schaltfläche. Ein Klick auf die Schaltfläche würde den Browse-Dialog öffnen und im Wesentlichen das Textfeld ausfüllen.Caliburn Micro Message.attach berücksichtigt Änderungen von Datenkontext nicht

<UserControl x:Class="MyUserControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:cal="http://www.caliburnproject.org" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="100"></ColumnDefinition> 
     <ColumnDefinition Width="*"></ColumnDefinition> 
    </Grid.ColumnDefinitions> 

    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"></RowDefinition> 
    </Grid.RowDefinitions> 

    <!-- Folder --> 
    <TextBlock>Path</TextBlock> 
    <DockPanel LastChildFill="True" Grid.Column="1"> 
     <Button DockPanel.Dock="Right" cal:Message.Attach="[Event Click] = [Action BrowseHotFolder()]" Content="..." HorizontalAlignment="Left" Width="25" Height="25" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Margin="0,0,5,0"/> 
     <TextBox Text="{Binding HotFolderPath, UpdateSourceTrigger=PropertyChanged, ValidatesOnNotifyDataErrors=True}" /> 
    </DockPanel> 
</Grid> 

Ich habe eine Listbox, die eine Anzahl von Objekten enthält. Das ausgewählte Objekt wird dieser Benutzersteuerung als Datenkontext zugeführt.

Jetzt sagen wir, ich habe zwei Elemente in meiner Listbox und ich habe die erste ausgewählt. Ich fülle "foo" in das Textfeld von MyUserControl. Dann wähle ich den zweiten Gegenstand und fülle "bar" aus. Die Datenbindung funktioniert einwandfrei, und für beide Elemente sind die richtigen Werte festgelegt. Wenn ich dann auf die Schaltfläche zum Durchsuchen auf der ersten Schaltfläche klicke und einen Ordner auswähle, wird das Textfeld des ersten Elements in den ausgewählten Pfad geändert. Wenn ich jedoch das zweite Element auswähle und zu einem Ordner blättere, ändert es auch das Textfeld des ersten Elements.

Meine Vermutung ist, dass die Message-Attach-Syntax nicht die Browse-Aktion auf das richtige Element aufrufen. Es ignoriert den Datenkontext (aktuell ausgewähltes Element) und verwendet nur das erste.

Was kann ich dagegen tun?

Antwort

0

Ich habe eine Abhilfe gemacht durch

cal:Message.Attach="[Event Click] = [Action BrowseHotFolder()]" 

zu

cal:Message.Attach="[Event Click] = [Action BrowseHotFolder($datacontext)]" 

nun ändern, die BrowseHotFolder-Methode immer noch auf dem falschen ItemViewModel genannt wird, aber weirdly $ Datacontext die richtige ItemViewModel gibt. In der Methode selbst mache ich jetzt:

public void BrowsePath(ItemViewModel context) 
{ 
    context.Path = _folderBrowsingService.Browse(); 
} 

Dies ist eine Problemumgehung, aber löst das Problem.

2

Ich denke, Ihre Vermutung ist richtig; Das für Message.Attach verwendete Ziel ist die erste Datenkontextbindung und wird nicht aktualisiert, wenn der Kontext nach der Benutzerauswahl geändert wird.

Wir sahen ein ähnliches Problem mit Benutzersteuerelementen, die in einem Inhaltssteuerelement geschaltet wurden - die Fehlerbehebung bestand darin, auf der Schaltfläche anzugeben.

Das Problem hier von Rob Eisenberg erwähnt: https://caliburnmicro.codeplex.com/discussions/257005

Verwandte Themen