WPF Close Window закрывает окно источника.Зачем? - PullRequest
0 голосов
/ 01 июля 2011

Проблема, которую я имею, немного сложна для описания, поэтому, пожалуйста, выслушайте ее.

Я просто открываю одно окно из другого и затем пытаюсь закрыть второе. Если я использую команду InputBindings второго, второй закрывается нормально. Если я вызываю закрытие напрямую, оно закрывает как первое, так и второе окно. Я ожидаю, что код поможет в этом сценарии.

WPF: Window1View (ключевая часть)

<Grid>
  <Button Content="Button" Command="{Binding RptKeyDownCommand}" />
</Grid>

Window1ViewModel: (сокращено для листинга)

using GalaSoft.MvvmLight.Command;
var _runCommand = new RelayCommand(() => Run(), () => CanRun());

    public void Run()
    {
        var v = new Window2();
        var vm = new Window2ViewModel();
        vm.RequestClose += v.Close;
        v.DataContext = vm;
        v.ShowDialog();
    }

    public event Action RequestClose;

    var _closeCommand = new RelayCommand(() => Close(), () => CanClose());
    public void Close()
    {
        if (RequestClose != null)
            RequestClose();
    }

WPF: Window2View

<Window.InputBindings>
    <KeyBinding Key="Escape" Command="{Binding CloseCommand}" />
</Window.InputBindings>
    <TextBox Text="Hello">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="PreviewKeyDown">
                <cmd:EventToCommand 
                     Command="{Binding Close2Command, Mode=OneWay}"
                     PassEventArgsToCommand="True" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </TextBox>

Window2ViewModel: (имеет ту же команду закрытия и конечную точку EventToCommand)

var _close2Command = new RelayCommand<KeyEventArgs>(p => Close2(p), p => CanClose2(p));

    public void Close2(KeyEventArgs e)
    {
        if (e.Key == Key.Escape)
            Close();               <- Here closes both Window1View and Window2View?
    }

Ответы [ 2 ]

0 голосов
/ 01 июля 2011

См. этот ответ в другой ветке для решения.

0 голосов
/ 01 июля 2011

Из Window2ViewModel вы должны вызывать RequestClose not Close.

Вот код для Window2ViewModel

RelayCommand _close2Command;
public ICommand Close2Command
{
    get
    {
        if (_close2Command == null)
        {
            _close2Command = new RelayCommand(param => CloseEx(), param => CanClose());
        }
        return _close2Command;
    }
}

public virtual void CloseEx()
{
    Close();
}

public event Action RequestClose;
public virtual void Close()
{
    if (RequestClose != null)
    {
        *RequestClose();*
    }
}
public virtual bool CanClose()
{
    return true;
}

Также Window1ViewModel должен иметь код как:

using GalaSoft.MvvmLight.Command;           
var _runCommand = new RelayCommand(() => Run(), () => CanRun()); 
var vm;

public void Run()               
{                   
    var v = new Window2();                   
    vm = new Window2ViewModel();                   
    vm.RequestClose += CloseV2;                   
    v.DataContext = vm;                   
    v.ShowDialog();               
}                          

public event Action RequestClose;                          
var _closeCommand = new RelayCommand(() => Close(), () => CanClose());    

public void CloseV2()               
{                   
    vm.Close();              
}

public void Close()               
{                   
    if (RequestClose != null)                       
    RequestClose();               
}

Попробуй понять твой код. Обратите внимание, что в вашем коде вы связываете событие V1.RequestClose с V2.RequestClose для того же метода Close В моем случае они у меня раздельные, и V2.RequestClose всегда будет вызывать vm.Close.

надеюсь, это поможет.

...