当前位置: 首页 > 知识库问答 >
问题:

WPF数据绑定不工作-使用代码创建数据模板

涂玉韵
2023-03-14

我在xaml代码中创建了一个名为ValueTreeView的treeView,它使用下面代码中创建的数据板,它完全绑定到一个通用类ValueHolder

这是用于绑定的类

public class ValueHolder
{
    public string VHName{ get; set; }
    public string VHValue{ get; set; }
}

这是具有treeview的用户控件

  public partial class UserControl1 : UserControl
  {
     ObservableCollection<ValueHolder> source;

     public UserControl1()
     {

        InitializeComponent();

        source= new ObservableCollection<ValueHolder>();

        //Data Template for the treeView

        DataTemplate cardLayout = new DataTemplate();
        cardLayout.DataType = typeof(ValueHolder);

        FrameworkElementFactory ValueStack= new FrameworkElementFactory(typeof(StackPanel));
        ValueStack.Name = "Details";
        ValueStack.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);

        FrameworkElementFactory VName= new FrameworkElementFactory(typeof(TextBlock));
        VName.SetBinding(TextBlock.TextProperty, new Binding("VHName"));
        ValueStack.AppendChild(VName);

        FrameworkElementFactory Space = new FrameworkElementFactory(typeof(TextBlock));
        Space.SetValue(TextBlock.WidthProperty, 10.0);
        ValueStack.AppendChild(Space);

        FrameworkElementFactory VValue= new FrameworkElementFactory(typeof(TextBlock));
        VValue.SetBinding(TextBlock.TextProperty, new Binding("VHValue"));
        ValueStack.AppendChild(VValue);

        cardLayout.VisualTree = ValueStack;

        ValueTreeView.ItemTemplate = cardLayout;

        //Initializing the TreeViewItems

        ValueHolder vh1 = new ValueHolder() { VHName = "VH1", VHValue = "456"};
        ValueHolder vh2 = new ValueHolder() { VHName = "VH2", VHValue = "578"};
        ValueHolder vh3 = new ValueHolder() { VHName = "VH3", VHValue = "235"};

        source.Add(vh1);
        source.Add(vh2);
        source.Add(vh3);

        ValueTreeView.ItemsSource = source;

    }

下面是选择项更改时调用的事件处理程序

    private void ValueTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    { 
        var s=((ValueHolder)((TreeView)sender).SelectedItem);
        if(s.VHName=="VH2")
            s.VHValue = "111";
    }
}

每个TreeViewItem中的两个文本块绑定到两个类变量。

我的问题是,当我更改Class属性的值时,它不会反映在UI中,即使我对TreeView的项目源使用了ObservableCollection。

事件处理程序更改类的VHValue属性,它在后端得到更改,但没有反映在用户界面中

我的xaml代码:

   <UserControl x:Class="Checker.UserControl1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
  <Grid>
  <TreeView x:Name="ValueTreeView" SelectedItemChanged="ValueTreeView_SelectedItemChanged">           
  </TreeView>
  </Grid>
  </UserControl>

共有1个答案

麻昌翰
2023-03-14

仅适用于集合更改,而不是集合中项的更改。您需要为ValueHolder类实现INotifyProperty tyChanged接口

  public class ValueHolder : INotifyPropertyChanged
  {
      private string _VHName;
      private string _VHValue;
      // Declare the event 
      public event PropertyChangedEventHandler PropertyChanged;

      public string VHName
      {
          get { return _VHName; }
          set
          {
              _VHName = value;
              // Call OnPropertyChanged whenever the property is updated
              OnPropertyChanged("VHName");
          }
      }

      public string VHValue
      {
          get { return _VHValue; }
          set
          {
              _VHValue= value;
              // Call OnPropertyChanged whenever the property is updated
              OnPropertyChanged("VHValue");
          }
      }

      // Create the OnPropertyChanged method to raise the event 
      protected void OnPropertyChanged(string name)
      {
          PropertyChangedEventHandler handler = PropertyChanged;
          if (handler != null)
          {
              handler(this, new PropertyChangedEventArgs(name));
          }
      }
  }
}
 类似资料:
  • 刚开始使用熊猫和python。 我有一个工作表,我已经读到一个数据框和应用的正向填充(ffill)方法。 然后我想创建一个包含两个工作表的excel文档。 在应用FFIL方法之前,一个工作表的数据帧中包含数据,而下一个工作表的数据帧应用了FFIL方法。 最终,我打算为数据框的某一列中的每个唯一数据实例创建一个工作表。 然后我想应用一些vba格式的结果-但我不确定哪个dll或插件或东西,我需要调用e

  • 我试图训练一个数据集来预测输入的文本是否来自科幻小说。我对python比较陌生,所以我不知道我到底做错了什么。 代码: 错误:回溯(最近一次呼叫上次): 文件“”,第1行,在main()中 文件"C:/用户/用户/桌面/分配/SQL /Python/DA项目/class17.py",第36行,在主model_novels() modelêselectedModel中的文件“C:/Users/use

  • 我是C#新手,我不断收到以下无法删除的错误。 我的代码如下,我不能确切地说出哪一行导致了错误,但我怀疑它与RibbonRadioButtons有关,因为如果我删除它们,我不会得到错误。只有在单击两个或更多单选按钮后,错误才会出现。ComboBoxItem上的一个回答继续抛出绑定错误,尽管style暗示是多个Refresh()语句导致了这个问题,但我不知道如何避免这个问题。 有人能帮我解决这个问题吗

  • 我直接下载了C:\中的derby,并设置了DERBY_INSTALL和CLASSPATH变量: 因此它显示ij>,并且我能够使用命令行SQL语句创建数据库。但我必须使用Java代码创建数据库及其表。所以我在下面的源代码,但我不知道在哪里粘贴它和如何运行它。当我将它粘贴到db-derby-10.9.1.0-bin>bin文件夹中,并尝试使用'java MainClass komaldb c:\'在该

  • 本文向大家介绍Vue模板语法中数据绑定的实例代码,包括了Vue模板语法中数据绑定的实例代码的使用技巧和注意事项,需要的朋友参考一下 1.单项数据绑定  通过浏览器 REPL 环境可以进行修改 app.input_val = 'Vue' 我们通过 vue 对象修改数据可以直接影响到 DOM 元素,但是,如果直接修改 DOM 元素,却不会影响到 vue 对象的数据;我们把这种现象称为 单向数据绑定 ;

  • 我正在尝试为PGInterval和Duration编写一个自定义数据类型绑定,以将jOOQ与TimescaleDB一起使用。遗憾的是,jOOQ在为数据库例程生成函数时没有使用它。 这是我的绑定类: 这是我在pom中的配置: 例如,我希望jOOQ生成例程 像 但是我得到了