Привязка к единственному элементу в CompositeCollection

Необходимо сбалансировать компромисс между безопасностью и восстанавливаемостью, с одной стороны, и простотой управления изменениями для всего проекта на другом.

лучшая схема, которую я использовал, имела два ответа на тот вопрос.

Мы использовали 2 абсолютно отдельных репозитория: каждый был широким репозиторием проекта, и другой был наш собственный персональный репозиторий (мы использовали rcs в то время).

Мы зарегистрировались бы в нашем персональном репозитории очень регулярно, в значительной степени каждый раз, когда Вы сохранили свои открытые файлы. Как таковой персональный репозиторий был в основном большим, долгим расположением, буфером отмены.

, Как только у нас был блок кода, который скомпилирует, протестированный хорошо и был принят как являющийся готовым к общему использованию, это было проверено в репозиторий проекта.

, К сожалению, эта система полагалась на использование различных технологий VCS, чтобы быть осуществимой. Я не нашел удовлетворительного метода достижения тех же результатов при использовании двух из VCS того же типа (например, два репозитория подрывной деятельности)

Однако, у меня были приемлемые результаты путем создания "персональных" ответвлений разработки в репозитории подрывной деятельности - зарегистрироваться в ответвлении регулярно и затем слияние в соединительную линию после завершения.

6
задан MojoFilter 2 December 2009 в 13:59
поделиться

3 ответа

Я опубликовал вопрос, очень похожий на ваш, относительно CompositeCollections: Почему CompositeCollection не может быть заморожен?

По-видимому, это ошибка в WPF, хотите верьте, хотите нет. Вот сообщение сотрудника MS, признающего это: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/b15cbd9d-95aa-47c6-8068-7ae9f7dca88a

The CompositeCollection не замораживается, но должно быть. Это затрудняет объединение нестатических элементов в одну коллекцию. Это обычный сценарий для многих вещей. Например, элемент «Выбрать один» в верхней части поля со списком, заполненного другими объектами привязки к данным, было бы неплохо, но вы не можете сделать это декларативно.

В любом случае, мне жаль, что это не ответ, но, надеюсь, это поможет вам понять, почему это не работает так, как вы думали.

2
ответ дан 17 December 2019 в 18:16
поделиться

Что ж, это самое близкое к вашим требованиям. Вся функциональность не содержится в одном 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; }
    }
}
0
ответ дан 17 December 2019 в 18:16
поделиться

Разве вы не можете просто открыть новую коллекцию из вашей ViewModel, к которой может быть привязано дерево?

Что-то вроде:

public Server LocalServer;
public ObservableCollection<Server> RemoteServers;

public IEnumerable ServerTree { return new[] { LocalServer, RemoteServers } }

В конце концов, ваша ViewModel является View Модель. Он должен отображать именно то, что нужно представлению.

1
ответ дан 17 December 2019 в 18:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: