如何在 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 的文本应该是我的 DataGridWaffe 单元格的新值,所以Waffe 的当前值被 TextBox.Text 更改为适当的名称。单击此按钮时:

来自 GumliDataGrid 数据的 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 属性。由于不清楚您的视图的结构、绑定属性的方式以及分配视图模型的位置,因此我无法提供合适的示例,但它应该很明显,为什么它不起作用以及如何继续。