Как установить datacontext для Datagrid - PullRequest
0 голосов
/ 14 марта 2019

Я изучаю wpf через mvvm. У меня есть ViewModel, которая привязана к представлению через окно datacontext

Window.Xaml:

xmlns:Converter="clr-namespace:UploadFileToDB.ViewModel"

  <Window.DataContext>
        <Converter:ViewModel/>
    </Window.DataContext>

Приложение работает нормально, когда все методы присутствуют внутри класса ViewModel.

Теперь у меня есть сетка данных в представлении, для заполнения сетки данных я создал отдельный класс populatedatagrid в пространстве имен ViewModel.

псевдокод, который не работает:

   namespace UploadFileToDB.ViewModel
{
    public class PopulateDatagrid
    {
        public ObservableCollection<datagridmodel> modelclasswithcombobox
        {
            get;
            set;
        }

        DataSet ds;
        public void comboboxdata()
        { //This code populate the observable collection}
        }
    }
        public class ViewModel : INotifyPropertyChanged
        {
            PopulateDatagrid populatedatagridwithobservablecollection = new PopulateDatagrid();
            public ViewModel()
            {
                populatedatagridwithobservablecollection.combobxdata();
            //Calling the above class method here to populate data. But this throws the error that BindingExpression path error that ModelClassWithcombobox property not found on object ViewModel
            }
        }
    }

Приведенный выше код работает неправильно из-за ошибки выражения привязки.

рабочий псевдокод:

   namespace UploadFileToDB.ViewModel
{
    public class ViewModel : INotifyPropertyChanged
        {
            public ObservableCollection<datagridmodel> modelclasswithcombobox
        {
            get;
            set;
        }

        DataSet ds;
        public void comboboxdata()
        { //This code populate the observable collection}
        }
            public ViewModel()
            {
                comboboxdata();
            }
        }
    }

Приведенный выше код работает без проблем. Насколько я понимаю, я сопоставил только класс ViewModel в текстовом формате. XAML не может найти наблюдаемую коллекцию, которая присутствует в другом классе.

Может ли кто-нибудь помочь мне в достижении сегрегации в классе и предложить решение по вышеуказанному сценарию

Редактировать: По запросу window.xaml

<Window
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="UploadFileToDB.Window1"
    xmlns:vm ="clr-namespace:UploadFileToDB.ViewModel" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
     xmlns:Converter="clr-namespace:UploadFileToDB.ViewModel"

    Title="Window1" Height="400" Width="800">
    <Window.DataContext>
        <Converter:ViewModel/>
    </Window.DataContext>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1500*"/>
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition Height="41*"/>
        </Grid.RowDefinitions>
<Tabcontrol>
<TabItem Header="Re Assign">
     <StackPanel>

                        <DataGrid  Height="150" x:Name="datagrid1" IsReadOnly="True" AutoGenerateColumns="True" CanUserAddRows="False" Width="507" Margin="150,-35,20,79" HorizontalAlignment="Left">
                            <DataGrid.Style>
                                <Style  TargetType="{x:Type DataGrid}">
                                    <Setter  Property="ItemsSource" Value="{Binding modelclasswithcombobox}"/>
                                </Style>
                            </DataGrid.Style>
                        </DataGrid>
                    </StackPanel>
</TabItem>
 </TabControl>
    </Grid>
</Window>

1 Ответ

0 голосов
/ 15 марта 2019

Вы можете связывать только со свойствами , , а не с полями .Так что для его работы вы должны использовать что-то вроде этого:

public class ViewModel : INotifyPropertyChanged
{
    public PopulateDatagrid Populatedatagridwithobservablecollection
    {
        get
        {
            return _populatedatagridwithobservablecollection;
        }
        set
        {
            if (value != _populatedatagridwithobservablecollection)
            {
                _populatedatagridwithobservablecollection = value;
                NotifyPropertyChanged(nameof(Populatedatagridwithobservablecollection));
            }
        }
    }
    private PopulateDatagrid _populatedatagridwithobservablecollection = new PopulateDatagrid();;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...