WPF Datagrid не обновляется - PullRequest
       21

WPF Datagrid не обновляется

0 голосов
/ 24 июня 2018

У меня (наиболее вероятно) очень простой вопрос к вам относительно таблицы данных WPF, который я связал с ObservableCollection и который, к сожалению, не обновляется, когда я добавляю элементы в эту коллекцию.

Это мой взгляд вкл. Датагрид:

<UserControl.Resources>
    <local:SinglePackTransactions_ViewModel x:Key="vm"/>
</UserControl.Resources>
...
...
...
    <DataGrid x:Name="DataGridRequestPacks_SinglePack" AutoGenerateColumns="False" Grid.Row="1" Width="700" Margin="30"
                      ItemsSource="{Binding SinglePackResultList, Source={StaticResource vm}}" IsReadOnly="True">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Created" Width="Auto" Binding="{Binding Created}"/>
            <DataGridTextColumn Header="Product Code" Width="Auto" Binding="{Binding ProductCode}"/>
        </DataGrid.Columns>
    </DataGrid>

Когда я нажимаю кнопку (Command = "SendRequestCmd"), я добавляю элемент моего пользовательского класса ("Pack") в свой ObservableCollection SinglePackResultList. В конструкторе моей ViewModel у меня это здесь:

SinglePackResultList = new ObservableCollection<Pack>();

SendRequestCmd = new RelayCommand((object z) =>
{
    try
    {
        SinglePackResultList.Add(SOAPRequest.SOAPRequestHandler(new Pack() {Created = (DateTime.Now).ToShortDateString(), ProductCode = ProductCode_SinglePack, BatchID = BatchID_SinglePack, BatchExpiry = BatchExpiry_SinglePack, PackSerialnumber = SerialNumber_SinglePack, PackTransaction = Transaction_SinglePack.TransactionID }));
    }
    catch (Exception)
    {
        return;
    }
},
CanExecute);

Когда я устанавливаю точку отладки, я вижу, что после каждого нажатия кнопки есть дополнительный элемент в моем ObservableCollection SinglePackResultList - так что это работает. Но, к сожалению, Датагрид остается пустым. Я пытался добавить NotifyPropertyChanged("SinglePackResultList") сразу после SinglePackResultList.Add(...), но это не сработало.

Я полностью потерян, как я могу заставить это работать. : - (

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

исходя из ваших отзывов, я могу определить свою ошибку. Я забыл установить DataContext моего ViewModel и удалил статический ресурс.

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

View-XAML:

<DataGrid x:Name="DataGridRequestPacks_SinglePack" AutoGenerateColumns="False" Grid.Row="1" Width="1150" Margin="30" ItemsSource="{Binding SinglePackResultList}" IsReadOnly="True">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Created" Width="Auto" Binding="{Binding Created}"/>
        <DataGridTextColumn Header="Product Code" Width="Auto" Binding="{Binding ProductCode}"/>
    </DataGrid.Columns>
</DataGrid>

View.cs (конструктор):

public SinglePackTransactions_View()
{
    InitializeComponent();
    this.DataContext = new SinglePackTransactions_ViewModel();
}

В моей ViewModel я просто использовал ObservableSollection как свойство:

public ObservableCollection<Pack> SinglePackResultList { get; set; }

В конструкторе моей ViewModel я использовал связанную ICommand-Button для добавления элементов в мою коллекцию ObservableCollection:

SinglePackResultList = new ObservableCollection<Pack>();

SendRequestCmd = new RelayCommand((object z) =>
{
    try
    {
        SinglePackResultList.Add(
            SOAPRequest.SOAPRequestHandler(
                new Pack()
                {
                    ProductCode = ProductCode_SinglePack,
                    BatchID = BatchID_SinglePack,
                    BatchExpiry = BatchExpiry_SinglePack,
                    PackSerialnumber = SerialNumber_SinglePack,
                    PackTransaction = Transaction_SinglePack.TransactionID
                }
            )
        );
    }
    catch (Exception e)
    {
        return;
    }
},
CanExecute);
0 голосов
/ 25 июня 2018

Два способа справиться с привязкой данных в WPF.

Создать в конструкторе и никогда не изменять его.Например,

public class A{
    public ObservableCollection<int> ObserableList { get; set; }

    public A() { ObservableList = new ObservableCollection<int>(); }
}

, тогда вы только добавляете или удаляете элементы в коллекции.

Или вы можете использовать полное свойство и событие PropertyChanged, таким образом вы можете назначить ему другую коллекцию.

public class A {
    private ObservableCollection<int> observableList;

    public ObservableCollection<int> ObservableList
    {
        get { return observableList; }
        set
        {
            observableList = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(ObservableList));
        }

    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void Init() 
    {
        ObservableList = new ObservableCollection<int>();
    }
}
...