2

我有一个简单的(我认为)应用程序,可以将 SQL 数据库读入我程序中的变量,然后我需要用我读取的数据更新在 XAML 中定义的网格视图。我受限于 .NET 3.5 的代码。我在有关 XAML、MS .NET 帮助和 Web 其他地方的书籍上进行的所有搜索显示了无数从 ASP.NET 执行此操作的示例,但没有一个来自 C#-XAML 组合的示例。我发现在 XAML ++much++ 中做简单的事情比在 Winforms 中做同样的事情更加困难和复杂,我只是不明白这一点。特别是,数据绑定在我看来是一门魔法。有人可以看看我的 XAML 并告诉我需要做什么或更改以从我的 C# 代码隐藏中填充此控件吗?

这是我的 XAML:

<Window x:Class="UCCResourceManager.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="UCC Resource Mangler" Height="350" Width="700">
  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height="250"/>
      <RowDefinition />
    </Grid.RowDefinitions>

    <ListView Name="grdResource"
              ItemsSource="{Binding}"
              Grid.Row="0">

      <ListView.View>

        <GridView AllowsColumnReorder="false"
              ColumnHeaderToolTip="UCC Resource Table">

          <GridViewColumn DisplayMemberBinding="{Binding Path=ID}"
                          Header="ID"
                          Width="50"/>

          <GridViewColumn DisplayMemberBinding="{Binding Path=LocationID}"
                          Header="LocationID"
                          Width="75"/>

          <GridViewColumn DisplayMemberBinding="{Binding Path=Type}"
                          Header="Type"
                          Width="50"/>

          <GridViewColumn DisplayMemberBinding="{Binding Path=Name}"
                          Header="Name"
                          Width="200"/>

          <GridViewColumn DisplayMemberBinding="{Binding Path=Enabled}"
                          Header="Enabled"
                          Width="50"/>

          <GridViewColumn DisplayMemberBinding="{Binding Path=Flags}"
                          Header="Flags"
                          Width="50"/>

        </GridView>

      </ListView.View>
    </ListView>

    <Button Name="btnOK"
            Content="OK"
            Grid.Row="1"
            Width="100"
            Height="20
            " Click="btnOK_Click" />

  </Grid>
</Window>
4

1 回答 1

0

我建议使用 MVVM。在那里你有一个 ViewModel 类,你可以在其中绑定你的属性。

public class MainWindowViewModel
{
    #region Constructor
    public MainWindowViewModel()
    {
        YourGridList = new ObservableCollection<GridElement>();

        var el = new GridElement
                     {
                         Element1 = "element 1", 
                         Element2 = "element 2", 
                         Element3 = "element 3"
                     };

        YourGridList.Add(el);
    }
    #endregion

    #region Private members

    private ObservableCollection<GridElement> _yourGridList;
    private ICommand _addElementCommand;

    #endregion

    #region Public properties
    public ObservableCollection<GridElement> YourGridList
    {
        get
        {
            return _yourGridList;
        }
        set
        {
            _yourGridList = value;
        }
    }
    #endregion

    #region Commands
    public ICommand AddElementCommand
    {
        get { return _addElementCommand ?? (_addElementCommand = new DelegateCommand(AddElement)); }
    }
    #endregion

    #region Private Methods
    private void AddElement()
    {
        var el = new GridElement
        {
            Element1 = "NewEl1",
            Element2 = "NewEl2",
            Element3 = "NewEl3"
        };

        YourGridList.Add(el);
    }
    #endregion

然后,您可以在 xaml.cs 文件中使用此类作为 DataContext。

 public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainWindowViewModel();
    }

从 xaml 文件中,您可以使用 ViewModel 的“YourGridList”属性填充 ListView ItemsSource。

<Window x:Class="WpfApplication6.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="35"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <Button Content="Add element" Command="{Binding AddElementCommand}" Grid.Row="0"/>


        <ListView Grid.Row="1"
                  Margin="10"
                  ItemsSource="{Binding YourGridList, UpdateSourceTrigger=PropertyChanged}"
                  MaxHeight="300">
            <ListView.View>
                <GridView>
                    <GridView.Columns>
                        <GridViewColumn Width="Auto">
                            <GridViewColumn.Header>
                                <GridViewColumnHeader Content="Element 1" HorizontalContentAlignment="Left" />
                            </GridViewColumn.Header>
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding Element1}"/>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                        <GridViewColumn Width="Auto">
                            <GridViewColumn.Header>
                                <GridViewColumnHeader Content="Element 2" HorizontalContentAlignment="Left" />
                            </GridViewColumn.Header>
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding Element2}"/>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                        <GridViewColumn Width="Auto" >
                            <GridViewColumn.Header>
                                <GridViewColumnHeader Content="Element 3" HorizontalContentAlignment="Left" />
                            </GridViewColumn.Header>
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding Element3}"/>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                    </GridView.Columns>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
</Grid>

这应该适用于更新您的 ListView 并在代码和 xaml 部分之间有明确的解耦。

于 2013-03-14T16:04:28.010 回答