Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在文本块中显示模型数据_C#_Wpf - Fatal编程技术网

C# 在文本块中显示模型数据

C# 在文本块中显示模型数据,c#,wpf,C#,Wpf,我需要在包含标签和文本块的简单网格中显示ViewModel中的数据。我尝试将数据绑定到网格,并使用ElementName将网格的DataContext与textBlocks绑定 图书视图模型: namespace Books.ViewModels { public class BookViewModel : IViewModel, INotifyPropertyChanged { private Book book = new Book(); pr

我需要在包含标签和文本块的简单网格中显示ViewModel中的数据。我尝试将数据绑定到网格,并使用ElementName将网格的DataContext与textBlocks绑定

图书视图模型:

namespace Books.ViewModels
{
    public class BookViewModel : IViewModel, INotifyPropertyChanged
    {
        private Book book = new Book();
        private ICommand AddCommand;
        private ICommand RemoveCommand;
        private ICommand ChangeCommand;

        public event PropertyChangedEventHandler PropertyChanged;

        public BookViewModel()
        {
            //initialize commands;
        }
        public string Name
        {
            get { return book.Name; }
            set { book.Name = value; }
        }

        public string Authors
        {
            get
            {
                return string.Join(", ", book.Authors.Select(x => x.Name));
            }
            set
            {
                //need to implemented
            }
        }
        public string ISBN
        {
            get { return book.ISBN; }
            set { book.ISBN = value; }
        }
        public int Pages
        {
            get { return book.Pages; }
            set { book.Pages = value; }
        }
        public string Tags
        {
            get
            {
                return string.Join(", ", book.Tags);
            }
            set
            {
                //not implemented
            }
        }
        public int PublicationYear
        {
            get { return book.PublicationYear; }
            set { book.PublicationYear = value; }
        }
        public string House
        {
            get
            {
                return book.House.Name;
            }
            set
            {
                //not implemented 
            }
        }

        public ICommand AddClick
        {
            get
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Add"));
                return AddCommand;
            }
        }

        public ICommand RemoveClick
        {
            get
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Remove"));
                return RemoveCommand;
            }
        }

        public ICommand ChangeClick
        {
            get
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Change"));
                return ChangeCommand;
            }
        }
    }
}
以Xaml表示的网格:

<Grid x:Name="bookGrid"
              Grid.Column="1">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>

            <Label Grid.Row="0" Grid.Column="0" Content="Title:"/>
            <Label Grid.Row="1" Grid.Column="0" Content="Author(s):"/>
            <Label Grid.Row="2" Grid.Column="0" Content="ISBN:"/>
            <Label Grid.Row="3" Grid.Column="0" Content="Pages:"/>
            <Label Grid.Row="4" Grid.Column="0" Content="Tags:"/>
            <Label Grid.Row="5" Grid.Column="0" Content="Publication Year:"/>
            <Label Grid.Row="6" Grid.Column="0" Content="Publication House:"/>
            <TextBlock Grid.Column="1" Grid.Row="0" Margin="3" Text="{Binding ElementName=bookGrid, Path=Name}"/>
            <TextBlock Grid.Column="1" Grid.Row="1" Margin="3" Text="{Binding ElementName=bookGrid, Path=Authors}"/>
            <TextBlock Grid.Column="1" Grid.Row="2" Margin="3" Text="{Binding ElementName=bookGrid, Path=ISBN}"/>
            <TextBlock Grid.Column="1" Grid.Row="3" Margin="3" Text="{Binding ElementName=bookGrid, Path=Pages}"/>
            <TextBlock Grid.Column="1" Grid.Row="4" Margin="3" Text="{Binding ElementName=bookGrid, Path=Tags}"/>
            <TextBlock Grid.Column="1" Grid.Row="5" Margin="3" Text="{Binding ElementName=bookGrid, Path=PublicationYear}"/>
            <TextBlock Grid.Column="1" Grid.Row="6" Margin="3" Text="{Binding ElementName=bookGrid, Path=House}"/>
        </Grid>

只需将TextBlock绑定更改为以下内容:

<TextBlock Grid.Column="1" Grid.Row="0" Margin="3" Text="{Binding Name}"/>
并在每次属性更改后调用此方法,如:

public string Name
{
    get { return book.Name; }
    set
    {
        book.Name = value;
        this.NotifyPropertyChanged();
    }
}

从这里开始阅读:。它正在修复绑定源(删除ElementName,
{binding Name}
),解决了这个问题。TextBlock的DataContext与Grid.DataContext相同。写入
ElementName
会阻止它。在viewModel中添加
INPC
实现与问题的上下文无关您完全正确。没有必要使用
INPC
来解决问题,我在回答问题后添加了它,因为它可以在数据上下文发生变化时提供帮助。
public void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
{
    if (this.PropertyChanged != null)
    {
        this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
public string Name
{
    get { return book.Name; }
    set
    {
        book.Name = value;
        this.NotifyPropertyChanged();
    }
}