繁体   English   中英

WPF Listview + GridView-视图未更新

[英]WPF Listview + GridView - View not Updating

我有一个带有Gridview子级的Listview项,绑定到对象列表。 在Gridview下方,我有一个texbox编辑Gridview的内容(绑定到Gridview)。 我可以添加新内容(显示在GridView中)。 当我编辑内容时,实际上它已被编辑(在对象列表中),但未显示在Gridview中(GridView似乎没有更新)

XAML代码:

<!-- ========= -->
<!-- root Grid -->
<!-- ========= -->
<Grid x:Name="root" Margin="10,10,10,10">
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="25" />
        <RowDefinition Height="25" />
        <RowDefinition Height="40" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="40" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <!-- ========= -->
    <!-- Data Grid -->
    <!-- ========= -->
    <ListView x:Name="dataGrid" Grid.Row="0" Grid.ColumnSpan="2" ItemsSource="{Binding}">
        <ListView.View>
            <GridView>
                <!-- first solution -->
                <GridViewColumn x:Name="gridColumnName" Header="Name" Width="160">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <ContentControl Content="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <!-- second solution -->
                <GridViewColumn x:Name="gridColumnPath" Header="Path" DisplayMemberBinding="{Binding Path=Path}" Width="490" />
            </GridView>
        </ListView.View>
    </ListView>

    <!-- ========= -->
    <!-- Edit Menu -->
    <!-- ========= -->
    <Label Content="Name:" Grid.Row="1" Grid.Column="0" VerticalAlignment="Bottom" HorizontalAlignment="Left"/>
    <TextBox x:Name="txtBoxName" Grid.Row="1" Grid.Column="1" Width="250" VerticalAlignment="Bottom" HorizontalAlignment="Left" 
             DataContext="{Binding ElementName=dataGrid, Path=SelectedItem}" 
             Text="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

    <Label Content="Path:" Grid.Row="2" Grid.Column="0" VerticalAlignment="Bottom" HorizontalAlignment="Left" />
    <TextBox x:Name="txtBoxPath" Grid.Row="2" Grid.Column="1" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" 
             DataContext="{Binding ElementName=dataGrid, Path=SelectedItem}" 
             Text="{Binding Path=Path, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

对象列表类:

class ItemList : ObservableCollection<LdapItem>
{
    public ItemList()
        : base()
    { 
    }
}

对象类:

class LdapItem : INotifyPropertyChanged
{
    #region constructor

    public LdapItem(String name, String path)
    {
        this.iD = Guid.NewGuid().ToString();
        this.name = name;
        this.path = path;
    }

    #endregion

    #region public proterties

    public String ID
    {
        get { return iD; }
    }

    public String Name
    {
        get { return name; }
        set { name = value; }
    }

    public String Path
    {
        get { return path; }
        set { path = value; }
    }

    #endregion

    #region public methods

    public void OnPropertyChanged(string prop)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(prop));
    }

    #endregion

    #region private variables

    private String name = String.Empty;
    private String path = String.Empty;
    private String iD = String.Empty;

    #endregion

    public event PropertyChangedEventHandler PropertyChanged;
}

任何想法为什么更新GridView不起作用?

如果您有许多模型,请使用实现INPC的基类。 然后将您的属性更改事件处理程序更改为:

public event PropertyChangedEventHandler PropertyChanged;

public void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

这样就无需指定要更改的模型属性。 减少拼写错误或忘记输入名称的次数。仍然需要调用this.OnPropertyChanged(),尽管您在多个设置方法中都没有找到它。

ItemList类没有意义。 可以替换为:

public ObservableCollection<LdapItem> LdapItems 

似乎您忘记了在属性更改时触发OnPropertyChangedEvent:

public String Name
{
    get { return name; }
    set { 
           name = value; 
           OnPropertyChanged("Name");
        }
}

如果您不触发PropertyChanged事件,则WPF将无法查看对象是否已更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM