Необходимо сбалансировать компромисс между безопасностью и восстанавливаемостью, с одной стороны, и простотой управления изменениями для всего проекта на другом.
лучшая схема, которую я использовал, имела два ответа на тот вопрос.
Мы использовали 2 абсолютно отдельных репозитория: каждый был широким репозиторием проекта, и другой был наш собственный персональный репозиторий (мы использовали rcs в то время).
Мы зарегистрировались бы в нашем персональном репозитории очень регулярно, в значительной степени каждый раз, когда Вы сохранили свои открытые файлы. Как таковой персональный репозиторий был в основном большим, долгим расположением, буфером отмены.
, Как только у нас был блок кода, который скомпилирует, протестированный хорошо и был принят как являющийся готовым к общему использованию, это было проверено в репозиторий проекта.
, К сожалению, эта система полагалась на использование различных технологий VCS, чтобы быть осуществимой. Я не нашел удовлетворительного метода достижения тех же результатов при использовании двух из VCS того же типа (например, два репозитория подрывной деятельности)
Однако, у меня были приемлемые результаты путем создания "персональных" ответвлений разработки в репозитории подрывной деятельности - зарегистрироваться в ответвлении регулярно и затем слияние в соединительную линию после завершения.
Я опубликовал вопрос, очень похожий на ваш, относительно CompositeCollections: Почему CompositeCollection не может быть заморожен?
По-видимому, это ошибка в WPF, хотите верьте, хотите нет. Вот сообщение сотрудника MS, признающего это: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/b15cbd9d-95aa-47c6-8068-7ae9f7dca88a
The CompositeCollection не замораживается, но должно быть. Это затрудняет объединение нестатических элементов в одну коллекцию. Это обычный сценарий для многих вещей. Например, элемент «Выбрать один» в верхней части поля со списком, заполненного другими объектами привязки к данным, было бы неплохо, но вы не можете сделать это декларативно.
В любом случае, мне жаль, что это не ответ, но, надеюсь, это поможет вам понять, почему это не работает так, как вы думали.
Что ж, это самое близкое к вашим требованиям. Вся функциональность не содержится в одном TreeView и не привязана к составной коллекции, но это может оставаться секретом между вами и мной;)
<Window x:Class="CompositeCollectionSpike.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300"
xmlns:local="clr-namespace:CompositeCollectionSpike">
<StackPanel>
<StackPanel.Resources>
<Style TargetType="TreeView">
<Setter Property="BorderThickness" Value="0"/>
</Style>
<HierarchicalDataTemplate DataType="{x:Type local:Server}"
ItemsSource="{Binding EndPoints}">
<Label Content="{Binding Name}"/>
</HierarchicalDataTemplate>
</StackPanel.Resources>
<TreeView ItemsSource="{Binding LocalServer}"/>
<TreeViewItem DataContext="{Binding RemoteServers}"
Header="{Binding Description}">
<StackPanel>
<Button Click="Button_Click">Add Remote Server</Button>
<TreeView ItemsSource="{Binding}"/>
</StackPanel>
</TreeViewItem>
</StackPanel>
using System.Collections.ObjectModel;
using System.Windows;
namespace CompositeCollectionSpike
{
public partial class Window1 : Window
{
private ViewModel viewModel;
public Window1()
{
InitializeComponent();
viewModel = new ViewModel
{
LocalServer =new ServerCollection{new Server()},
RemoteServers =
new ServerCollection("Remote Servers") {new Server(),
new Server(), new Server()},
};
DataContext = viewModel;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
viewModel.LaunchAddRemoteServerDialog();
}
}
public class ViewModel:DependencyObject
{
public ServerCollection LocalServer { get; set; }
public ServerCollection RemoteServers { get; set; }
public void LaunchAddRemoteServerDialog()
{}
}
public class ServerCollection:ObservableCollection<Server>
{
public ServerCollection(){}
public ServerCollection(string description)
{
Description = description;
}
public string Description { get; set; }
}
public class Server
{
public static int EndpointCounter;
public static int ServerCounter;
public Server()
{
Name = "Server"+ ++ServerCounter;
EndPoints=new ObservableCollection<string>();
for (int i = 0; i < 2; i++)
{
EndPoints.Add("Endpoint"+ ++EndpointCounter);
}
}
public string Name { get; set; }
public ObservableCollection<string> EndPoints { get; set; }
}
}
Разве вы не можете просто открыть новую коллекцию из вашей ViewModel, к которой может быть привязано дерево?
Что-то вроде:
public Server LocalServer;
public ObservableCollection<Server> RemoteServers;
public IEnumerable ServerTree { return new[] { LocalServer, RemoteServers } }
В конце концов, ваша ViewModel является View Модель. Он должен отображать именно то, что нужно представлению.