【问题标题】:INotifyPropertChanged Updating Bound Listview/gridviewINotifyPropertChanged 更新绑定 Listview/gridview
【发布时间】:2014-01-05 12:24:31
【问题描述】:

好的,问题是我的 INotifyPropertyChanged 没有更新列表视图 n XAML

DiscoveredData.NetworkedComputersResults = NetworkedComputers;

ListView_LocalComputers.ItemsSource = DiscoveredData.NetworkedComputersResults;

因为我知道我可以使用 ItemsSource 将数据加载到列表视图中,所以我认为问题出在 XAML 中。

如果有人能指出我正确的方向,我将非常感激。

另外,如果您发现我做错了,请指教,我对这种编码语言相当陌生,并希望以正确的方式做到这一点

提前谢谢你

<ListView Name="ListView_LocalComputers" ItemsSource="{Binding NetworkedComputerResults}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Status">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Border CornerRadius="2,2,2,2" Width="20" Height="20" Background="Transparent" BorderBrush="Transparent" Margin="3,3,3,3">

                            <Image HorizontalAlignment="Left" VerticalAlignment="Center" Width="12" Height="12" Source="{Binding Image}" Stretch="Fill" Margin="2,2,2,2"/>
                        </Border>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Header="Local Computers" DisplayMemberBinding="{Binding ComputerName}">
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>


//Constructor
public NetworkInformation()
{
    InitializeComponent();
    this.DataContext = DiscoveredData; //Defines the class to the view
    Discovery();
}
//Method
public void Discovery()
{

    GetIcon Icon = new GetIcon();
    BitmapImage IconOfComputer = null;
    List<DiscoveredComputer> NetworkedComputers = new List<DiscoveredComputer>();
    DirectoryEntry Discover = new DirectoryEntry("WinNT://Workgroup");
    BitmapImage On = Icon.LoadIcon(@"/Images/Icons/ComputerOn.ico");
    BitmapImage Off = Icon.LoadIcon(@"/Images/Icons/ComputerOff.ico");
    foreach (DirectoryEntry Node in Discover.Children)
    {
        try
        {
            if (Node.Properties.Count > 0)
            {
                IconOfComputer = On;
            }
        }
        catch
        {
            IconOfComputer = Off;
        }
        if (Node.Name != "Schema") { NetworkedComputers.Add(new DiscoveredComputer { Image = IconOfComputer, ComputerName = Node.Name, MyToolTip = "Node Type = " + Node.SchemaEntry.Name }); }
    }
    DiscoveredData.NetworkedComputersResults = NetworkedComputers;
    ListView_LocalComputers.ItemsSource = DiscoveredData.NetworkedComputersResults;
}
private class GetIcon
{
    public BitmapImage IconStorage { get; set; }
    public BitmapImage LoadIcon(String IconPath)
    {
        BitmapImage GeneratedIcon = new BitmapImage();
        GeneratedIcon.BeginInit();
        GeneratedIcon.UriSource = new Uri("pack://application:,,," + IconPath, UriKind.RelativeOrAbsolute);
        GeneratedIcon.EndInit();
        IconStorage = GeneratedIcon;
        return GeneratedIcon;
    }
}

public class NetworkData : INotifyPropertyChanged
{
    #region Property Notify Standard for all classes
    public event PropertyChangedEventHandler PropertyChanged;
    public void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(property));
    }
    #endregion

    #region Bound Data To View
    private List<DiscoveredComputer> _NetworkedComputersResults;
    public List<DiscoveredComputer> NetworkedComputersResults { 
        get { return _NetworkedComputersResults; }
        set
        {
            _NetworkedComputersResults = value;
            NotifyPropertyChanged("NetworkedComputersResults");
        }
    }
    #endregion
    public class DiscoveredComputer : NetworkData
    {
        public string ComputerName { get; set; }
        public BitmapImage Image { get; set; }
        public String MyToolTip { get; set; }
    }
}

【问题讨论】:

    标签: c# .net wpf gridview inotifypropertychanged


    【解决方案1】:

    您应该使用ObservableCollection。它实现了INotifyCollectionChanged,它会在集合发生更改时发出通知,而不仅仅是单个项。

    项目本身当然应该实现INotifyPropertyChanged...

    【讨论】:

      【解决方案2】:

      您将一个普通的List&lt;T&gt; 绑定到您的ListView。然而这很好用,它不能满足在添加/删除项目时动态更新列表视图的要求。

      如果您需要在 ListView 中动态添加/删除元素,只需使用 ObservableCollection&lt;T&gt; 而不是 List`。

      private ObservableCollection<DiscoveredComputer> _NetworkedComputersResults;
      public ObservableCollection<DiscoveredComputer> NetworkedComputersResults { 
          get { return _NetworkedComputersResults; }
          set
          {
              _NetworkedComputersResults = value;
              NotifyPropertyChanged("NetworkedComputersResults");
          }
      }
      

      如果您只需要动态添加/删除元素,那么可观察集合中的元素不需要实现INotifyPropertyChanged 接口。

      【讨论】:

        【解决方案3】:
        public class NetworkData 
        {
            public NetworkData()
            {
                NetworkedComputersResults = new ObservableCollection<DiscoveredComputer>();
            }
            public ObservableCollection<DiscoveredComputer> NetworkedComputersResults{get;set;}
        }
        

        发现方法

        public void Discovery()
        {
        
            GetIcon Icon = new GetIcon();
            BitmapImage IconOfComputer = null;
            List<DiscoveredComputer> NetworkedComputers = new List<DiscoveredComputer>();
            DirectoryEntry Discover = new DirectoryEntry("WinNT://Workgroup");
            BitmapImage On = Icon.LoadIcon(@"/Images/Icons/ComputerOn.ico");
            BitmapImage Off = Icon.LoadIcon(@"/Images/Icons/ComputerOff.ico");
            foreach (DirectoryEntry Node in Discover.Children)
            {
                try
                {
                    if (Node.Properties.Count > 0)
                    {
                        IconOfComputer = On;
                    }
                }
                catch
                {
                    IconOfComputer = Off;
                }
                if (Node.Name != "Schema") { NetworkedComputers.Add(new DiscoveredComputer { Image = IconOfComputer, ComputerName = Node.Name, MyToolTip = "Node Type = " + Node.SchemaEntry.Name }); }
            }
        
            //Use Clear and Add .Dont assign new instance DiscoveredData.NetworkedComputersResults=new ....
            DiscoveredData.NetworkedComputersResults.Clear();
        
            foreach (var item in NetworkedComputers)
            {
                DiscoveredData.NetworkedComputersResults.Add(item);
            }
        }
        

        我希望这会有所帮助。从我个人的观点来看,如果您在 ViewModel 中创建此 Discovery 方法并从 ViewModel 的构造函数中调用它,那就太好了。似乎有两种方式的通信,比如你从 View 设置 ViewModel 的属性,这就是 Binding 的工作,而不是背后的代码

        【讨论】:

        • DiscoveredData.NetworkedComputersResults.Clear(); - 错误对象未设置为实例。
        • 我已经复制了这段代码,但仍然看不到这些项目。只是想知道我应该在某个地方通知 InotifyPropertyChanged 吗?
        • 使用 ObservableCollection 时不需要这样做。
        猜你喜欢
        • 2014-10-31
        • 1970-01-01
        • 2017-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多