WPF Databinding: Как я могу связать хранимую процедуру с ListView - PullRequest
2 голосов
/ 06 мая 2009

У меня есть кнопка, которая при нажатии запускает хранимую процедуру на SQL Server и отображает полученные данные в сетке в том же окне.

В мире оконных форм я бы создал таблицу данных, использовал бы ее для заполнения, а затем назначил таблицу данных для свойства DataSource моего DataGridView и poof ... это мои данные.

Я пробовал нечто подобное в WPF, используя ListView с Gridview, и я не могу заставить его работать. У меня есть следующее в моем XAML: </p> <pre><code><ListView Grid.Row="1" Name="Preview" ItemsSource="{Binding Path=Report}"> <GridView> <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=FormalName}" /> </GridView> </ListView>

И в моем коде C #

private void CreateReport(object sender, RoutedEventArgs e) 
{
  DataTable dt = new DataTable("Report");
  SqlConnection cn = new SqlConnection("Data Source=DailyTimesheets;
             Initial Catalog=DailyTimesheets;Integrated Security=SSPI");

  SqlCommand cm = new SqlCommand("Reports.PayrollHoursInterface", cn);
  cm.Parameters.AddWithValue("@PayBatchID", 722);
  cm.CommandType = CommandType.StoredProcedure;

  SqlDataAdapter da = new SqlDataAdapter(cm);
  da.Fill(dt);

  Preview.DataContext=dt;
}

Когда я нажимаю кнопку (которая запускает метод CreateReport), моя таблица данных заполняется и присваивается тексту Datacontext, но ничего не отображается.

Ответы [ 3 ]

6 голосов
/ 07 мая 2009

Я сделал пример приложения и обнаружил, что вам нужно окружить свой GridView списком ListView.View и установить для ItemsSource значение {Binding}, как показано ниже:

<ListView Name="Preview" ItemsSource="{Binding}">
<ListView.View>
  <GridView>
    <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=FormalName}" />
  </GridView>
 </ListView.View>
</ListView>
1 голос
/ 06 мая 2009

Я думаю, что часть проблемы в том, что вы все еще думаете о WinForms. Вместо привязки Grid к таблице, как насчет привязки ListBox к коллекции?

Попробуйте вместо этого:

1) Создайте другой класс, который реализует INotifyPropertyChanged. Мы собираемся использовать этот класс для DataContext. Думайте об этом как о вашем BindingEngine. Я обычно делаю это DataContext самого окна, делая его доступным в любом месте окна.

2) Предоставьте свойство в новом классе ObservableCollection, где YourType - это другой класс, который реализует INotifyPropertyChanged и предоставляет свойства данных, которые вы хотите отобразить.

3) Создайте метод в Engine, который заполняет вашу Коллекцию. Затем запустите событие PropertyChanged при его заполнении.

4) Привязать источник элементов ListBox к свойству.

5) Создайте ItemTemplate и используйте имена свойств из YourType для привязки.

Это псевдо-код, но он должен вас приблизить:

<Window>
    <Window.Resources>
        <ObjectDataProvider x:Key="MyEngineDS" ObjectType="{x:Type MyEngine:MyEngineNamespace}" d:IsDataSource="True"/>
        <DataTemplate x:Key="ItemTemplate1">
            <TextBlock Text="{Binding MyPropertyName}" />
        </DataTemplate>
    </Window.Resources>
    <Window.DataContext>
        <Binding Mode="OneWay" Source="{StaticResource MyEngineDS}"/>
    </Window.DataContext>
    <Grid x:Name="LayoutRoot">
        <ListBox ItemsSource="MyCollection" ItemTemplate="{DynamicResource ItemTemplate1}" />
    </Grid>
</Window>

Надеюсь, это поможет.

0 голосов
/ 06 мая 2009

Попробуйте вместо этого использовать ItemsSource = "{Binding}".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...