WPF将文本框值从模式窗口传递到主C#

时间:2018-08-13 18:40:45

标签: c# wpf

我正在尝试学习WPF MVVM,我需要了解如何通过模式窗口更新文本框值。在代码下面,我编写了将值传递给ViewModel的操作,但未更新文本框。预先感谢

UserControl 控制台文本框

<TextBox x:Name="Text01UC" Text="{Binding TextUC, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Width="200" Height="33"/>

背后的用户控件

 namespace InvioDati
{
 public partial class textbox : UserControl
{
public textbox()
{
    InitializeComponent();
    var vm = new ModelTextView();
    this.DataContext = vm;
    vm.Load();
}

private void Open_Click(object sender, RoutedEventArgs e)
{
    MoadalWindow md = new MoadalWindow();
    md.ShowDialog();
}
}
}

ModelTextView

namespace InvioDati
 {
  class ModelTextView : BaseViewModel
   {
    private ModelText dati = new ModelText();
    public string TextUC
    {
        get => dati.TextVal;
        set
        {
            dati.TextVal = value;
            OnPropertyChanged();
        }
    }

    public void Load() { 
    TextUC = "GoodMorning";

    }
    public void Ricevi(string valore)
    {
        TextUC = valore;

    }
 }
}

后面的ModalWindow代码     命名空间InvioDati     {

public partial class MoadalWindow : Window
{
    public MoadalWindow()
    {
        InitializeComponent();
    }

    private void Test_Click(object sender, RoutedEventArgs e)
    {
        ModelTextView nd = new ModelTextView();
        nd.Ricevi(Send.Text);
        this.Close();
    }
}
}

2 个答案:

答案 0 :(得分:1)

DataContext的{​​{1}}设置为ModalWindowModelTextView的相同实例:

textbox.xaml.cs

然后您可以直接绑定到private void Open_Click(object sender, RoutedEventArgs e) { MoadalWindow md = new MoadalWindow(); md.DataContext = this.DataContext; md.ShowDialog(); } 属性,也可以在TextUC中执行以下操作:

ModalWindow.xaml.cs

答案 1 :(得分:0)

  1. 您必须使用调解器才能在此处断开mvvm。 选中https://en.wikipedia.org/wiki/Mediator_pattern#C#

1b。添加观察者模式可为值更改创建通知。

  1. 在MVVM中,对话框是有害的,通常您不需要它们。您想要的是一个叠加视图,它可以以任何方式绑定数据,因为可视树没有中断

  2. 如果要使用“对话框”,请实施DialogService来使用。

编辑:这是有关如何以最简单的方式创建“弹出”内容的草案:

<UserControl>
    <Grid>
        <!--Invert visability of all controls below via binding-->
        <YourMainControl/>
        <Rect Fill="Black" Opacity=".5 Visibility="Hidden"/>
        <YourSubControl Visibility="Hidden"/> 
    </Grid>
</UserControl>