INotifyPropertChanged更新绑定列表视图/ gridview

时间:2014-01-05 12:24:32

标签: c# .net wpf gridview inotifypropertychanged

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

DiscoveredData.NetworkedComputersResults = NetworkedComputers;<这是将数据加载到DataContext然后调用iproperty notify的地方。

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

3 个答案:

答案 0 :(得分:1)

您应该使用ObservableCollection。它实现了INotifyCollectionChanged,它通知集合何时发生变化,而不仅仅是单个项目。

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

答案 1 :(得分:0)

您将普通List<T>绑定到ListView。但是,这样可以正常工作,当添加/删除项目时,它不能满足动态更新列表视图的要求。

如果您需要ListView中的动态添加/删除元素,只需使用ObservableCollection<T>代替List`。

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

如果你需要的是动态添加/删除元素,那么observable集合中的元素不需要实现INotifyPropertyChanged接口。

答案 2 :(得分:0)

public class NetworkData 
{
    public NetworkData()
    {
        NetworkedComputersResults = new ObservableCollection<DiscoveredComputer>();
    }
    public ObservableCollection<DiscoveredComputer> NetworkedComputersResults{get;set;}
}
  

DiscoveryMethod

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的工作而不是代码的背后