2016-09-16 7 views
0

Я пытаюсь создать небольшой инструмент для Microsoft Team Founation Server (что не так важно для вопроса). Однако я не знаком с C# и WPF, и даже после прочтения некоторых руководств о привязках и ресурсах я не могу понять, как заставить код работать. С Visual Studio Designer я создал небольшую форму, в которой есть только несколько кнопок и текстовое поле, которое должно отображать имя авторизованного пользователя. К сожалению, после входа в систему вызывается ArgumentException. Поэтому возникает вопрос: как я могу привязать локальные TfsTeamProjectCollection к tfsTeamProjectCollectionViewSource? Спасибо за помощь!Как установить источник 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

Вы должны использовать GetDefaultView статический метод класса CollectionViewSource дать мнение о вашей коллекции.

Вот что вам нужно сделать.

tfsTeamProjectCollectionViewSource.Source = CollectionViewSource.GetDefaultView(m_tfs_team_project_collection); 

Также вы не задали контекст данных окна как само окно.

Попробуйте сделать это.

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

Выполнение вышеуказанного, любое связывание в коде xaml будет искать его источник в окне.

Другая вещь, которую я обнаружил в вашем коде, ошибочна в том, что вы определили tfsTeamProjectCollectionViewSource как локальную переменную, а не элемент данных окна.

Попробуйте сделать его членом данных, например m_tfs_team_project_collection, а затем посмотреть, что произойдет.

+0

Спасибо за ответ. Хорошая вещь: она больше не разбивается, плохое: текстовое поле ничего не показывает, хотя я успешно вошел в систему. – AquilaRapax

+0

Где переменная AuthorizedIdentity в вашем коде? Я не вижу, чтобы он был установлен и уведомлял цели, которые он изменил с помощью NotifyPropertyChanged. –

+0

Также вы не установили какой-либо контекст данных для своего xaml. Вы знаете об этих понятиях? –

Смежные вопросы