【问题标题】:How can I replace one value of my DataGrid automatically with the value of my TextBox.Text in WPF?如何在 WPF 中用 TextBox.Text 的值自动替换 DataGrid 的一个值?
【发布时间】:2021-10-28 16:02:03
【问题描述】:

我是 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 个RadioButtons 和一个TextBox。这 3 个 RadioButtons 用于我的 DataGrid 中的 3 个名称。当检查987654336 RadioButton 987654337 @的文本时,@应该是我的DataGrid中的 waffe em>单元格的新值,使 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 班级我得到这样的数据:

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}"

【问题讨论】:

    标签: c# wpf xaml mvvm datagrid


    【解决方案1】:

    首先,您的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不同 实例,因为您为类中的Zwerg 字段创建了Zwerg 的新实例在Gumli_Click 处理程序中。 click 处理程序实际上并没有做任何事情,它创建了一个 local 变量 Zwerg 并分配了它的 Waffe 属性。它只存在于点击处理程序的范围内,之后它就消失了,它没有任何作用。

    初始化程序中的以下行仅将_Zwerg.Waffe 的当前实例(string)分配给列表中的Zwerg 实例。 _Zwerg.Waffe 的后续更改不会自动应用到列表中的 Zwerg 实例。它们不会以任何方式被引用或链接。

    Waffe = _Zwerg.Waffe
    

    相反,共享List&lt;Zwerg&gt; 或当前Zwerg 从列表中 并分配其Waffe 属性。由于尚不清楚您的视图是如何构建的,如何绑定属性以及在何处分配视图模型,因此我无法提供合适的示例,但应该很明显,为什么它不起作用以及如何继续。

    【讨论】:

      猜你喜欢
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-15
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      相关资源
      最近更新 更多