将数据库连接到列表框

时间:2018-08-22 11:11:26

标签: c# wpf mongodb

我目前正在学习WPF,C#和MongoDB。 我想进入数据库并将我的_Id显示到列表视图中。 因此,我在主窗口中有一个按钮,当我单击该按钮时,会弹出一个窗口,并显示数据库中所有“ _id”的列表。 我不知道该怎么做,我一直在努力。 在这里:

ConnectionServer

public partial class ConnectionServers : UserControl
{
    public  List<TextBlock> serverId { get;set; }

    public ObservableCollection<ConnectionServers> serversList  { get; set;  }

    public String svList { get; set; }

    public ConnectionServers()
    {
        InitializeComponent();
    }
}

XML

    <Grid>
    <ListBox x:Name="listBoxServers" Grid.Row="1" BorderThickness="0" 
     ItemsSource="{Binding serversList}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock x:Name="textBlockServersId" Text="{Binding 
    serverId}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

MainWindow

  private ObservableCollection<ConnectionServers> listOfServers;

     private  async void dataBaseMongoAsync(string collectionName)
    {

        var client = new MongoClient("mongodb://XXXXXXXX");
        var db = client.GetDatabase("Project");

        var collection = db.GetCollection<BsonDocument>(collectionName);


        await collection.Find(new BsonDocument()).ForEachAsync(_id => ListOfServers.Add(new ConnectionServers() { serversList = _id }));


    }



private void onConnect_Click(object sender, RoutedEventArgs e)
    {

        ConnectionServers availableServers = new ConnectionServers();

        Window serversList = new Window
        {
            Title = "Server List",
            Content = availableServers,
            Height = 300,
            Width = 350,
            Background = FindResource("WindowBackground") as Brush,
            ResizeMode = ResizeMode.NoResize
        };

        serversList.ShowDialog();

    }

编辑:我不明白问题所在。我在想的是何时执行此操作:

 await collection.Find(new BsonDocument()).ForEachAsync(_id => ListOfServers.Add(new ConnectionServers() { serversList = _id }));~

而不是ListOfServers,是serversList(但是我不能从这里访问它)。我的逻辑是将texblock绑定到列表,然后将结果递增到列表。

2 个答案:

答案 0 :(得分:0)

除非您正在使用处理PropertyChanged事件的框架,否则您需要自己提高它。即:

private List<Text> _servers;
public List<Text servers
{
get { return _servers;}
set { _servers = value;
OnPropertyChanged(nameof(servers));}}

其他一些注意事项:

  1. 您既没有使用ViewModel,也没有定义DataContext。您必须在绑定上将源设置为其自身,或者仅在用户控件的构造函数中添加DataContext = this;允许使用UserControl作为自己的VM,首先这是一个非常糟糕的设计-请参阅下面的Clemens评论
  2. 我看不到TextBlocks列表的原因,无论如何这都是不好的做法。您想将数据与UI-分开,然后使用绑定在ui中显示所述数据
  3. 您需要绑定到标题(在列表框中,每个项目模板会将其Datacontext设置为列表中的相关项目/类)

答案 1 :(得分:0)

项目模板中的文本框已绑定到serverId列表,该列表未在其他地方使用。

相反,它应该绑定到服务器的ID属性,因为列表框中的每个项目都将是serversList ObservableCollection中的服务器之一,因为这就是它绑定到的ItemSource。

调试绑定问题时,它会帮助您在Visual Studio的“输出”窗口中检查调试消息,因为您通常会收到有用的消息(如果很长很复杂)。