2016-09-16 52 views
0

我正在尝试为微软Team Founation Server创建一个小工具(这对于这个问题并不重要)。然而,我并不熟悉C#和WPF,甚至在阅读了关于绑定和资源的一些教程之后,我无法弄清楚,如何让代码工作。 使用Visual Studio Designer我创建了一个小表单,它只是有一些按钮和一个文本框,应该显示授权用户的名称。 不幸的是,登录后,抛出了ArgumentException。所以问题是:我如何绑定我的本地TfsTeamProjectCollectiontfsTeamProjectCollectionViewSource? 感谢您的帮助!如何设置CollectionViewSource的来源

<Window 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:TFSBranchingTool" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase" 

     xmlns:Client="clr-namespace:Microsoft.TeamFoundation.Client;assembly=Microsoft.TeamFoundation.Client" x:Class="TFSBranchingTool.MainWindow" 

     mc:Ignorable="d" 
     Title="TFSBranchingTool" Height="360" Width="560" 
     x:Name="wnd" Loaded="wnd_Loaded"> 
    <Window.Resources> 
     <CollectionViewSource x:Key="tfsTeamProjectCollectionViewSource" d:DesignSource="{d:DesignInstance {x:Type Client:TfsTeamProjectCollection}, CreateList=True}" Source="{Binding}"/> 
    </Window.Resources> 
    <Grid Margin="0,0,0,-1"> 
     <Menu x:Name="menu" VerticalAlignment="Top" Background="{DynamicResource {x:Static SystemColors.MenuBrushKey}}" d:IsLocked="True"> 
      <MenuItem Header="File"> 
       <MenuItem Header="Exit" HorizontalAlignment="Left" Click="exit_application_click"/> 
      </MenuItem> 
      <MenuItem Header="Team"> 
       <MenuItem Header="Connect to server" HorizontalAlignment="Left" Margin="0" Width="201" Click="connect_to_server_click"/> 
      </MenuItem> 
     </Menu> 
     <StatusBar x:Name="statusbar" VerticalAlignment="Bottom" Margin="0,0,0,-2" MinHeight="16"> 
      <StatusBarItem x:Name="connection_status" Content="{Binding TeamProjectCollection.AuthorizedIdentity.DisplayName}" HorizontalAlignment="Left"/> 
     </StatusBar> 
     <Grid x:Name="grid1" DataContext="{StaticResource tfsTeamProjectCollectionViewSource}" HorizontalAlignment="Left" Margin="138,122,0,0" VerticalAlignment="Top"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="Auto"/> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 
      </Grid.RowDefinitions> 
      <Label Content="Display Name:" Grid.Column="0" HorizontalAlignment="Left" Margin="3" Grid.Row="0" VerticalAlignment="Center"/> 
      <TextBox x:Name="displayNameTextBox" Grid.Column="1" HorizontalAlignment="Left" Height="23" Margin="3" Grid.Row="0" Text="{Binding AuthorizedIdentity.DisplayName, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" VerticalAlignment="Center" Width="120"/> 
     </Grid> 
    </Grid> 

这里是逻辑:

using Microsoft.TeamFoundation.Client; 
using System.Windows; 

namespace TFSBranchingTool 
{ 
    /// <summary> 
    /// Interaktionslogik für MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     private TfsTeamProjectCollection m_tfs_team_project_collection; 

     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void exit_application_click(object sender, RoutedEventArgs e) 
     { 
      Close(); 
     } 

     private void connect_to_server_click(object sender, RoutedEventArgs e) 
     { 
      TeamProjectPicker team_project_picker = new TeamProjectPicker(TeamProjectPickerMode.NoProject, false); 
      if (team_project_picker.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
      { 
       m_tfs_team_project_collection = team_project_picker.SelectedTeamProjectCollection; 

       System.Windows.Data.CollectionViewSource tfsTeamProjectCollectionViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("tfsTeamProjectCollectionViewSource"))); 

       //ArgumentException : 
       //Additional Information: "<TFS-URI>" is an invalid value for the property "Source". 

       tfsTeamProjectCollectionViewSource.Source = m_tfs_team_project_collection; 
      } 
     } 
    } 
} 

回答

0

你必须使用GetDefaultViewCollectionViewSource类的静态方法给视图您的收藏。

这是你必须做的。

tfsTeamProjectCollectionViewSource.Source = CollectionViewSource.GetDefaultView(m_tfs_team_project_collection); 

此外,您还没有将窗口的数据上下文设置为窗口本身。

试着做这个。

public MainWindow() 
{ 
    InitializeComponent(); 
    DataContext = this; 
} 

通过以上操作,xaml代码中的任何绑定都将在窗口中查找其源。

我在代码中发现错误的另一件事是,您已将 tfsTeamProjectCollectionViewSource定义为本地变量而非Window的数据成员。

试着让它成为像m_tfs_team_project_collection这样的数据成员,然后看看会发生什么。

+0

感谢您的回答。好事是:它不再崩溃,坏消息是:虽然我成功登录,但文本框并未显示任何内容。 – AquilaRapax

+0

代码中的AuthorizedIdentity变量在哪里?我没有看到它被设置,并通过NotifyPropertyChanged –

+0

通知它已更改的目标您还没有为您的xaml设置任何数据上下文。你知道这些概念吗? –