Как обновить sh DataGrid в приложении xaml / uwp - PullRequest
0 голосов
/ 08 февраля 2020

Я ищу простой способ обновить sh DataGrid в моем приложении xaml / uwp, потому что внешние события иногда влияют на строки в моей сетке. Например, у меня есть строка с кнопкой в ​​ней, которую необходимо отключить, если связь с inte rnet потеряна.

Я знаю, как получить обратный вызов при изменении подключения, и я знаю, как настроить кнопку таким образом, чтобы ее свойство IsEnabled устанавливалось или очищалось в соответствии с состоянием подключения.

Я не могу понять, как заставить сетку обновлять sh это свойство при изменении состояния сети.

1 Ответ

0 голосов
/ 10 февраля 2020

Как обновить sh DataGrid в приложении xaml / uwp

Вы можете использовать событие NetworkHelper NetworkChanged, чтобы определить состояние сети, а затем сделать состояние сети отметьте текущее значение DataContext и привяжите его к свойству DataGridTextColumn Binding.

public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string PropertyName = null)
{
    this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName));
}
private bool _isConnected;
public bool IsConnected
{
    get
    {
        return _isConnected;
    }
    set
    {
        _isConnected = value;
        OnPropertyChanged();
    }
}

 NetworkHelper.Instance.NetworkChanged += Instance_NetworkChanged;

 private async void MainPage_Loaded(object sender, RoutedEventArgs e)
 {
     if (NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable)
     {
         await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
         {
             IsConnected = true;
         });

     }
 }

 private async void Instance_NetworkChanged(object sender, EventArgs e)
 {
     if (NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable)
     {
         await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
         {
             IsConnected = true;
         });
     }
     else
     {
         await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
         {
             IsConnected = false;
         });
     }
 }

код Xaml

<controls:DataGrid
    x:Name="MyDataGrid"

     ......

    >
    <controls:DataGrid.Columns>
        <controls:DataGridTextColumn
            Width="*"
            Binding="{Binding ElementName=MyDataGrid, Path=DataContext.IsConnected, Mode=TwoWay}"
            FontSize="25"
            Header="ID"
            Tag="Id"
            Visibility="Visible"
            />

Обратите внимание

мы не можем использовать его следующим образом, потому что он не может получить доступ к root DataContext со второго уровня DataTemplate.

<controls:DataGridTemplateColumn>
    <controls:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock x:Name="Test" Text="{Binding Id}" />
                <Button Content="Flag" IsEnabled="{Binding ElementName=MyDataGrid, Path=DataContext.IsConnected, Mode=TwoWay}" />
            </StackPanel>
        </DataTemplate>
    </controls:DataGridTemplateColumn.CellTemplate>
</controls:DataGridTemplateColumn>
...