如何设置CollectionViewSource的源代码

时间:2016-09-16 09:28:06

标签: c# wpf tfs

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

<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;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您必须使用GetDefaultViewCollectionViewSource类的静态方法来为您的集合提供视图。

这是你必须做的。

tfsTeamProjectCollectionViewSource.Source = CollectionViewSource.GetDefaultView(m_tfs_team_project_collection);

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

尝试这样做。

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

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

我在代码中发现错误的另一件事是你已经定义了 tfsTeamProjectCollectionViewSource作为局部变量而不是Window的数据成员。

尝试将其设为m_tfs_team_project_collection之类的数据成员,然后查看会发生什么。