在哪里放置供不同用户控件使用的文本框?
where to put the textbox that for different UserControls to use?
在我的 WPF 程序中。我有一个 DataModel.cs、MainWindow.xaml & MainWindow.xaml.cs 和许多 UserControl.xaml & UserControl.xaml.cs,它们以这种方式集成到 MainWindow.xaml 中:
<Border...>
<UserControl1/>
</Border>
<Border...>
<UserControl2/>
</Border>
...
不知道能不能叫MVVM?
我的一些 UserControl.xaml.cs 需要使用相同的字符串进行连接,应该在 UI 文本框的某处输入,如下所示:
DataModel.connection.Connect("[textbox.text]");
我的问题是我应该把这个文本框放在哪里,以便每个 UserControl 都可以访问它,以及如何访问它?谢谢
我认为你需要阅读更多关于 MVVM 的知识,简短的回答,只要你不直接在你的 ViewModel 中引用和 UI 元素,你就可以认为它是 MVVM。
有多种方法可以实现,我会定义并与
交互
public 接口 IProvideTextProperty {string SomeText{get;set;}}
在所有使用此 属性
的用户控件中实现此接口
- 在UI的MainWindow中有一个文本框,将此TextBox的文本属性绑定到SomeText(MainWindow的viewmodel也实现了IProvideTextProperty),在setter中循环IProvideTextProperty 和设置 SomeProperty 的所有视图模型。
您在 DataModel
class 中创建了一个 string
属性:
public class DataModel : INotifyPropertyChanged
{
private string _text;
public string Name
{
get { return _text; }
set
{
_text = value;
OnPropertyChanged(nameof(Name));
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string property)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
}
...并将视图中的 TextBox
绑定到此 string
属性:
<TextBox Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}" />
假设您将 window 的 DataContext
设置为您的 DataModel
class:
的实例
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new DataModel();
}
}
...只要您在 TextBox
中输入内容,来源 属性 (Text
) 就会更新。如果让 UserControls
从父 window 继承 DataContext
,即不要在某处显式设置 UserControls
的 DataContext
,它们可以绑定到Text
属性 并获取最新值 "automatically" 作为 DataModel
实现 INotifyPropertyChanged
接口并引发 PropertyChanged
事件。
这就是基本 MVVM 的大致工作方式。
在我的 WPF 程序中。我有一个 DataModel.cs、MainWindow.xaml & MainWindow.xaml.cs 和许多 UserControl.xaml & UserControl.xaml.cs,它们以这种方式集成到 MainWindow.xaml 中:
<Border...>
<UserControl1/>
</Border>
<Border...>
<UserControl2/>
</Border>
...
不知道能不能叫MVVM?
我的一些 UserControl.xaml.cs 需要使用相同的字符串进行连接,应该在 UI 文本框的某处输入,如下所示:
DataModel.connection.Connect("[textbox.text]");
我的问题是我应该把这个文本框放在哪里,以便每个 UserControl 都可以访问它,以及如何访问它?谢谢
我认为你需要阅读更多关于 MVVM 的知识,简短的回答,只要你不直接在你的 ViewModel 中引用和 UI 元素,你就可以认为它是 MVVM。
有多种方法可以实现,我会定义并与
交互public 接口 IProvideTextProperty {string SomeText{get;set;}}
在所有使用此 属性
的用户控件中实现此接口
- 在UI的MainWindow中有一个文本框,将此TextBox的文本属性绑定到SomeText(MainWindow的viewmodel也实现了IProvideTextProperty),在setter中循环IProvideTextProperty 和设置 SomeProperty 的所有视图模型。
您在 DataModel
class 中创建了一个 string
属性:
public class DataModel : INotifyPropertyChanged
{
private string _text;
public string Name
{
get { return _text; }
set
{
_text = value;
OnPropertyChanged(nameof(Name));
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string property)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
}
...并将视图中的 TextBox
绑定到此 string
属性:
<TextBox Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}" />
假设您将 window 的 DataContext
设置为您的 DataModel
class:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new DataModel();
}
}
...只要您在 TextBox
中输入内容,来源 属性 (Text
) 就会更新。如果让 UserControls
从父 window 继承 DataContext
,即不要在某处显式设置 UserControls
的 DataContext
,它们可以绑定到Text
属性 并获取最新值 "automatically" 作为 DataModel
实现 INotifyPropertyChanged
接口并引发 PropertyChanged
事件。
这就是基本 MVVM 的大致工作方式。