c# - 无法从父 View 模型WPF MVVM应用程序的弹出窗口中获取值

标签 c# wpf xaml mvvm viewmodel

我正在尝试从父 View 模型访问子窗口的 View 模型的属性值。我正在从父 View 模型调用窗口。我想基于 subview 模型的操作在主窗口中进行更改。我无法在父 View 模型中获得任何 subview 模型值。我正在MVVM模式中尝试此操作。
对话框的界面

 public interface IWindowService
{
    void OpenDialogWindow(DialogViewModel vm);
     
}
父 View 模型
 public class FunctionalViewModel : INotifyPropertyChanged
    {
private readonly IWindowService _windowService;
 private string connectionString;

        public string ConnectionString
        {
            get { return connectionString; }
            set
            {
                connectionString = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("ConnectionString"));
            }
        }
 public FunctionalViewModel(IWindowService windowService)
        {
           BuildConnectionCommand = new RelayCommand(new Action<object>(BuildConnectionString));
            _windowService = windowService;
        }
   private void BuildConnectionString(object obj)
        {
            MessageBox.Show("will open a window");
            _windowService.OpenDialogWindow(new DialogViewModel());                                  

        }
}
subview 模型
public class DialogViewModel : FunctionalViewModel,INotifyPropertyChanged
    {
        private string textboxsaf;

        public string Textboxsaf
        {
            get { return textboxsaf; }
            set {
                textboxsaf = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Textboxsaf"));
            }
        }

        private ICommand connectionCommand;

        public ICommand ConnectionCommand
        {
            get { return connectionCommand; }
            set { connectionCommand = value; }

        }
        public DialogViewModel()
        {
            
            ConnectionCommand = new RelayCommand(new Action<object>(SetValue));
            

        }
        public event PropertyChangedEventHandler PropertyChanged;


        public void SetValue(object test)
        {
            textboxsaf= "ValueFromPopUpWindo";           
            Application.Current.Windows[1].Close();
            
        }
     

        }
ChildWindow.xaml
    <Grid>
        <Label x:Name="label" Content="my popup window" HorizontalAlignment="Left" Margin="73,68,0,0" VerticalAlignment="Top" Width="132"/>
        <TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="73,121,0,0" 
                 TextWrapping="Wrap" 
                 Text="{Binding Path=Textboxsaf,Mode=TwoWay}" VerticalAlignment="Top" Width="120"/>
        <Button x:Name="button" Content="Button" HorizontalAlignment="Left"
                Margin="109,177,0,0" VerticalAlignment="Top" Width="75"
                 Command="{Binding Path=ConnectionCommand }"
                 />

    </Grid>
</Window>
MainWindow.xaml
<Grid>
 <Button Name="btnConnectionString" Grid.Row="0" Grid.Column="2" Content="Connection string" Height="40" Width="150"
                                 Command="{Binding Path=BuildConnectionCommand}"
                                        DataContext="{Binding tfs}"></Button>
</Grid>
主窗口文件后面的代码
MainWindow.xaml.cs
public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new MainViewModel()
            {
                rel = new ReleaseViewModel(),
                tfs =  new FunctionalViewModel(new WindowService()),
                wnd = new DialogViewModel()
            };

        }

  
    }
    public class WindowService : IWindowService
    {
        public void OpenDialogWindow(DialogViewModel vm)
        {
            ConnectionWindow win = new ConnectionWindow();
            win.DataContext = vm;            
            win.Show();            
        }               
    }
问题
我想从父 View 模型(FunctionalViewModel)访问 subview 模型(DialogViewModel)中属性 Textboxsaf 的值。从funcitonalviewModel中将 Textboxsaf 的值分配给 ConnectionString 。关窗后好。

最佳答案

我不会使用PropertyChanged来检索DialogViewModel.Textboxsaf的值,因为此属性在对话框的生存期内可能会多次更改。
我会让IWindowService.OpenDialogWindow返回一个自定义的DialogResult对象或原始DialogViewModel,可能会将IWindowService.OpenDialogWindow转换为异步方法。
或者实现IWindowService.DialogClosed事件:
FunctionalViewModel.cs

public class FunctionalViewModel : INotifyPropertyChanged
{
    private readonly IWindowService _windowService;
    private string connectionString;

    public string ConnectionString
    {
        get { return connectionString; }
        set
        {
            connectionString = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.ConnectionString)));
        }
    }

    private void BuildConnectionString(object obj)
    {
        MessageBox.Show("will open a window");
        _windowService.DialogClosed += OnDialogClosed;
        _windowService.OpenDialogWindow(new DialogViewModel());                                  
    }

    private void OnDialogClosed(object sender,  DialogResultEventArgs e)
    {
        _windowService.DialogClosed -= OnDialogClosed;
        ConnectionString = e.Result.Textboxsaf;
    }
}
WindowService.cs
public class WindowService : IWindowService
{
    public event EventHandler<DialogResultEventArgs> DialogClosed;
    public void OpenDialogWindow(DialogViewModel vm)
    {
        ConnectionWindow win = new ConnectionWindow();
        win.DataContext = vm;
        win.Closed += OnConnectionWindowClosed;
        win.Show();            
    } 
          
    protected virtual void OnConnectionWindowClosed(object sender, EventArgs e)
    {
        var dialog = sender as FrameworkElement;
        this.DialogClosed?.Invoke(this, new DialogResultEventArgs(dialog.DataContext as DialogViewModel));
    }               
}
DialogResultEventArgs.cs
public class DialogResultEventArgs : EventArgs
{
    public DialogViewModel Result { get; }
          
    public DialogResultEventArgs(DialogViewModel result) => this.Result = result;
}

关于c# - 无法从父 View 模型WPF MVVM应用程序的弹出窗口中获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62576911/

相关文章:

c# - linq 查询返回太多结果

c# - 在 oxyplot 中突出显示单个点?

c# - 如何为字符串中的特定关键字预着色?

c++ - [UWP][C++]如何改变App.xaml的位置

c# - 在应用商店应用中获取 HTML 值

c# - JSON 变量未在回发时更新

wpf - 如何在WPF应用程序中获取登录的用户窗口的凭据

c# - 将描边应用于 XAML 中的文本 block

c# - 如何在UWP中的GridView中捕获Scroll事件

c# - 为什么匿名Action在C#中可以一行调用,而VB却不行?