c# - 将常量 Collection 绑定到 ComboBox 和 SelectedItem 到 TextBox
问题描述
我是 WPF 中 MVVM 的新手,我遇到以下问题。
我尝试拥有的是两个 ComboBoxes,每个都绑定到与 synchronized相同的ObservableCollection<TwoProperties> DList
属性,所以我在我的 XAML 中写了这个ItemsSource
SelectedItem
<ComboBox ItemsSource="{Binding DList}" DisplayMemberPath="Property1" SelectedItem="{Binding SelectedD}" />
<ComboBox ItemsSource="{Binding DList}" DisplayMemberPath="Property2" SelectedItem="{Binding SelectedD}" />
使用此视图模型
public class ViewModel : INotifyPropertyChanged
{
private ObservableCollection<TwoProperties> _dList =
new ObservableCollection<TwoProperties> {
new TwoProperties(1,"one"),
new TwoProperties(2,"two")
};
public ObservableCollection<TwoProperties> DList
{
get { return _dList; }
set { _dList = value; OnPropertyChanged("DList"); }
}
private TwoProperties _selectedD;
public TwoProperties SelectedD
{
get { return _selectedD; }
set { _selectedD = value; OnPropertyChanged("SelectedD"); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
在哪里
public class TwoProperties
{
public double Property1 { get; set; }
public string Property2 { get; set; }
public TwoProperties (double p1, string p2)
{
Property1 = p1;
Property2 = p2;
}
}
我还想要两个文本框来显示当前SelectedItem
同步组合框的属性。属性Property1
和应该是Property2
可编辑的,但是应该保持不变/只读并且不改变它的值。SelectedD
ObservableCollection<TwoProperties> _dList
<TextBox Text="{Binding SelectedD.Property1}" />
<TextBox Text="{Binding SelectedD.Property2}" />
但是,当我编辑 TextBoxes并因此编辑 SelectedD 时,_dList 也会更改其值,这不是我想要的。
我希望我能解释我的问题。我确定我在这里遗漏了一些简单的东西。
解决方案
这可以通过将 TextBoxes 的绑定模式更改为以下一种方式轻松实现:
<TextBox Text="{Binding SelectedD.Property1,Mode=OneWay}" />
<TextBox Text="{Binding SelectedD.Property2,Mode=OneWay}" />
因此,当您更改 textBox 值时,更改不会反映回 Observable 集合对象。
请注意,您可以通过修改以下方法来摆脱视图模型 OnPropertyChanged 中的神奇字符串:
private void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
然后您可以在视图模型内的任何属性的设置器中调用它,而无需传递属性的名称,如下所示:
private TwoProperties _selectedD;
public TwoProperties SelectedD
{
get { return _selectedD; }
set { _selectedD = value; OnPropertyChanged(); }
}
编辑 2:更新我的绑定和视图模型以获取视图模型中的编辑值
查看模型更新:
private double? editPropertyOne;
public double? EditPropertyOne
{
get { return editPropertyOne; }
set
{
editPropertyOne = value;
OnPropertyChanged();
}
}
private string editPropertyTwo;
public string EditPropertyTwo
{
get { return editPropertyTwo; }
set
{
editPropertyTwo = value;
OnPropertyChanged();
}
}
private TwoProperties _selectedD;
public TwoProperties SelectedD
{
get { return _selectedD; }
set
{
_selectedD = value; OnPropertyChanged();
if (_selectedD != null)
{
EditPropertyOne = _selectedD.Property1;
EditPropertyTwo = _selectedD.Property2;
}
}
}
Xaml 更改:
<TextBox Text="{Binding EditPropertyOne}" />
<TextBox Text="{Binding EditPropertyTwo}" />
推荐阅读
- css - OpenType 功能“案例”在 IE/Edge 中不起作用
- angular6 - Asp.Net Core Angular 6 错误:NPM 脚本“开始”退出,但未指示 Angular CLI 正在侦听请求
- tree - 第一次未调用 ADF 中树中的链接上的 actionListner
- arrays - 将执行时定义的一系列单元格复制到数组
- node.js - Netlify TOML 文件中的默认路径设置
- android-studio - 颤振安装错误
- c# - .netcore rpc调用java端webservice,抛出异常
- java - FTP 客户端从 TLS 1.0 升级到 TLS 1.2
- excel - 将 acrobat.acroapp 嵌入到 excel 用户表单中
- google-sheets - 检查Google表格中列之间的相似性字符串