如何在 WPF 中用 TextBox.Text 的值自动替换 DataGrid 的一个值?
How can I replace one value of my DataGrid automatically with the value of my TextBox.Text in WPF?
我是 WPF 中 MVVM 的新手,但我当前的项目是这个。我有一个 TabControl
和一个 TabItem
我有一个 DataGrid
在那里我得到这样的数据:
new Zwerg { Name = "Gimli", Alter = 140,Stamm="Elbknechte", Magwert = "12 & 15", Waffe = _Zwerg.Waffe, Machtfaktor = 27, Steuern = 27 * 2.125 },
new Zwerg { Name = "Zwingli", Alter = 70, Stamm = "Elbknechte", Magwert = "45 & 15", Waffe = "Zauberstab & Streithammer", Machtfaktor = 60, Steuern = 60 * 2.125 },
new Zwerg { Name = "Gumli", Alter = 163, Stamm = "Altobarden", Magwert = "17", Waffe = "Axt", Machtfaktor = 17, Steuern = 17 * 2.125 }
我有另一个 TabItem
,我有 3 个 RadioButton
和一个 TextBox
。这3个RadioButton
是我DataGrid
中的3个名字。当检查其中一个 RadioButton
时,我的 TextBox
的文本应该是我的 DataGrid
中 Waffe 单元格的新值,所以Waffe 的当前值被 TextBox.Text
更改为适当的名称。单击此按钮时:
来自 Gumli
的 DataGrid
数据的 Waffe 行从此更改为:
对此:
所以这取决于选择的名称,只有选择名称的“武器”部分应该自动更改为我的值 TextBox
.
我第一次尝试使用 MVVM。
这是我的视图模型代码:
public class ViewModel : INotifyPropertyChanged
{
private ICollectionView _zwerge;
Zwerg _Zwerg = new Zwerg();
public ViewModel()
{
Zwerge = CollectionViewSource.GetDefaultView(GetData());
}
public ICollectionView Zwerge
{
get => _zwerge;
set
{
_zwerge = value;
NotifyPropertyChanged(nameof(Zwerge));
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void UpdatePersons() => _zwerge?.Refresh();
public IList<Zwerg> GetData()
{
return new List<Zwerg>
{
new Zwerg { Name = "Gimli", Alter = 140,Stamm="Elbknechte", Magwert = "12 & 15", Waffe = _Zwerg.Waffe, Machtfaktor = 27, Steuern = 27 * 2.125 },
new Zwerg { Name = "Zwingli", Alter = 70, Stamm = "Elbknechte", Magwert = "45 & 15", Waffe = "Zauberstab & Streithammer", Machtfaktor = 60, Steuern = 60 * 2.125 },
new Zwerg { Name = "Gumli", Alter = 163, Stamm = "Altobarden", Magwert = "17", Waffe = "Axt", Machtfaktor = 17, Steuern = 17 * 2.125 }
};
}
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
从我的 Zwerg
class 我得到这样的数据:
string _Waffe;
public string Waffe
{
get => _Waffe;
set { _Waffe = value; }
}
我试图让它与以下产品一起使用:
private void Gumlie_Click(object sender, RoutedEventArgs e)
{
Zwerg _zwerg = new Zwerg();
_zwerg.Waffe = addZwerg.Text;
}
但这没有用。这就是我在 XAML:
中绑定 DataGrid
数据的方式
ItemsSource="{Binding Zwerge}"
首先,您的 Zwerg
类型需要实现 INotifyPropertyChanged
以便在用户界面中指示对 Waffe
属性 的任何更改,否则绑定在DataGrid
不会更新。
public class Zwerg : INotifyPropertyChanged
{
string _Waffe;
public string Waffe
{
get => _Waffe;
set
{
if (_Waffe == value)
return;
_Waffe = value;
OnPropertyChanged();
}
}
// ...other properties and code.
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
您遇到的问题很可能是您使用了 Zwerg
的 不同 个实例,因为您为 [=37] 创建了 Zwerg
的新实例=]Zwerg 字段在 class 和 Gumli_Click
处理程序中。点击处理程序实际上没有做任何事情,它创建了一个 local 变量 Zwerg
并分配给它的 Waffe
属性。它只存在于点击处理程序的范围内,之后它就消失了,它没有任何作用。
初始化程序中的以下行仅将 _Zwerg.Waffe
的当前实例 (string
) 分配给列表中的 Zwerg
实例。 _Zwerg.Waffe
的后续更改不会 自动应用于列表中的 Zwerg
实例。它们未以任何方式被引用或链接。
Waffe = _Zwerg.Waffe
相反,共享列表 中的 List<Zwerg>
或当前 Zwerg
并分配其 Waffe
属性。由于不清楚您的视图的结构、绑定属性的方式以及分配视图模型的位置,因此我无法提供合适的示例,但它应该很明显,为什么它不起作用以及如何继续。
我是 WPF 中 MVVM 的新手,但我当前的项目是这个。我有一个 TabControl
和一个 TabItem
我有一个 DataGrid
在那里我得到这样的数据:
new Zwerg { Name = "Gimli", Alter = 140,Stamm="Elbknechte", Magwert = "12 & 15", Waffe = _Zwerg.Waffe, Machtfaktor = 27, Steuern = 27 * 2.125 },
new Zwerg { Name = "Zwingli", Alter = 70, Stamm = "Elbknechte", Magwert = "45 & 15", Waffe = "Zauberstab & Streithammer", Machtfaktor = 60, Steuern = 60 * 2.125 },
new Zwerg { Name = "Gumli", Alter = 163, Stamm = "Altobarden", Magwert = "17", Waffe = "Axt", Machtfaktor = 17, Steuern = 17 * 2.125 }
我有另一个 TabItem
,我有 3 个 RadioButton
和一个 TextBox
。这3个RadioButton
是我DataGrid
中的3个名字。当检查其中一个 RadioButton
时,我的 TextBox
的文本应该是我的 DataGrid
中 Waffe 单元格的新值,所以Waffe 的当前值被 TextBox.Text
更改为适当的名称。单击此按钮时:
来自 Gumli
的 DataGrid
数据的 Waffe 行从此更改为:
对此:
所以这取决于选择的名称,只有选择名称的“武器”部分应该自动更改为我的值 TextBox
.
我第一次尝试使用 MVVM。
这是我的视图模型代码:
public class ViewModel : INotifyPropertyChanged
{
private ICollectionView _zwerge;
Zwerg _Zwerg = new Zwerg();
public ViewModel()
{
Zwerge = CollectionViewSource.GetDefaultView(GetData());
}
public ICollectionView Zwerge
{
get => _zwerge;
set
{
_zwerge = value;
NotifyPropertyChanged(nameof(Zwerge));
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void UpdatePersons() => _zwerge?.Refresh();
public IList<Zwerg> GetData()
{
return new List<Zwerg>
{
new Zwerg { Name = "Gimli", Alter = 140,Stamm="Elbknechte", Magwert = "12 & 15", Waffe = _Zwerg.Waffe, Machtfaktor = 27, Steuern = 27 * 2.125 },
new Zwerg { Name = "Zwingli", Alter = 70, Stamm = "Elbknechte", Magwert = "45 & 15", Waffe = "Zauberstab & Streithammer", Machtfaktor = 60, Steuern = 60 * 2.125 },
new Zwerg { Name = "Gumli", Alter = 163, Stamm = "Altobarden", Magwert = "17", Waffe = "Axt", Machtfaktor = 17, Steuern = 17 * 2.125 }
};
}
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
从我的 Zwerg
class 我得到这样的数据:
string _Waffe;
public string Waffe
{
get => _Waffe;
set { _Waffe = value; }
}
我试图让它与以下产品一起使用:
private void Gumlie_Click(object sender, RoutedEventArgs e)
{
Zwerg _zwerg = new Zwerg();
_zwerg.Waffe = addZwerg.Text;
}
但这没有用。这就是我在 XAML:
中绑定DataGrid
数据的方式
ItemsSource="{Binding Zwerge}"
首先,您的 Zwerg
类型需要实现 INotifyPropertyChanged
以便在用户界面中指示对 Waffe
属性 的任何更改,否则绑定在DataGrid
不会更新。
public class Zwerg : INotifyPropertyChanged
{
string _Waffe;
public string Waffe
{
get => _Waffe;
set
{
if (_Waffe == value)
return;
_Waffe = value;
OnPropertyChanged();
}
}
// ...other properties and code.
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
您遇到的问题很可能是您使用了 Zwerg
的 不同 个实例,因为您为 [=37] 创建了 Zwerg
的新实例=]Zwerg 字段在 class 和 Gumli_Click
处理程序中。点击处理程序实际上没有做任何事情,它创建了一个 local 变量 Zwerg
并分配给它的 Waffe
属性。它只存在于点击处理程序的范围内,之后它就消失了,它没有任何作用。
初始化程序中的以下行仅将 _Zwerg.Waffe
的当前实例 (string
) 分配给列表中的 Zwerg
实例。 _Zwerg.Waffe
的后续更改不会 自动应用于列表中的 Zwerg
实例。它们未以任何方式被引用或链接。
Waffe = _Zwerg.Waffe
相反,共享列表 中的 List<Zwerg>
或当前 Zwerg
并分配其 Waffe
属性。由于不清楚您的视图的结构、绑定属性的方式以及分配视图模型的位置,因此我无法提供合适的示例,但它应该很明显,为什么它不起作用以及如何继续。