Я работаю над настраиваемым элементом управления панелью, и одна из вещей, которые я пытаюсь сделать, это обмен файлами во время выполнения. Для этого контроля есть два состояния: Максимизировано и Нормально. Когда пользователь нажимает кнопку на элементе управления, состояние переключается. В этом элементе управления есть два свойства: MaximizedContent и MinimizedContent. Когда нажата кнопка для переключения состояний, свойство Content элемента управления необходимо поменять между MaximizedContent и MinimizedContent. Проблема возникает, когда есть привязки внутри MaximizedContent или MinimizedContent. Кажется, что они не являются частью «Дерева», и поэтому привязка не работает ... по крайней мере, это моя теория. Итак, мой вопрос в том, как сделать их частью дерева?WPF - Swapping ContentControl (relinking elements ???)
Вот упрощенный пример:
MainWindow.xaml
<Window x:Class="SwappingContentTest.MainWindow"
Loaded="Window_Loaded"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:local="clr-namespace:SwappingContentTest"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel HorizontalAlignment="Left">
<Button x:Name="swapContentButton"
Click="swapContentButton_Click"
Content="Swap Content" />
<local:SwappableContentControl x:Name="swappableControl">
<local:SwappableContentControl.MaximizedContent>
<StackPanel>
<CheckBox x:Name="maximizedCheckBox"
Content="Maximized CheckBox" />
<Button x:Name="maximizedButton"
Content="Maximized Button"
IsEnabled="{Binding ElementName=maximizedCheckBox, Path=IsChecked}" />
</StackPanel>
</local:SwappableContentControl.MaximizedContent>
<local:SwappableContentControl.MinimizedContent>
<StackPanel>
<CheckBox x:Name="minimizedCheckBox"
Content="Minimized CheckBox" />
<Button x:Name="minimizedButton"
Content="Minimized Button"
IsEnabled="{Binding ElementName=minimizedCheckBox, Path=IsChecked}" />
</StackPanel>
</local:SwappableContentControl.MinimizedContent>
</local:SwappableContentControl>
<CheckBox x:Name="standardCheckBox"
Content="Standard CheckBox"
Margin="0,20,0,0"/>
<Button x:Name="standardButton"
Content="StandardButton"
IsEnabled="{Binding ElementName=standardCheckBox, Path=IsChecked}" />
</StackPanel>
</Window>
MainWindow.cs
namespace SwappingContentTest
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
swappableControl.SwapContent();
}
private void swapContentButton_Click(object sender, RoutedEventArgs e)
{
swappableControl.SwapContent();
}
}
}
SwappableContentControl.cs
namespace SwappingContentTest
{
public class SwappableContentControl : ContentControl
{
public static readonly DependencyProperty MaximizedContentProperty = DependencyProperty.Register("MaximizedContent", typeof(object), typeof(SwappableContentControl));
public static readonly DependencyProperty MinimizedContentProperty = DependencyProperty.Register("MinimizedContent", typeof(object), typeof(SwappableContentControl));
public static readonly DependencyProperty StateProperty = DependencyProperty.Register("State", typeof(SwappableContentControlState), typeof(SwappableContentControl),
new PropertyMetadata(new PropertyChangedCallback(StatePropertyCallback)));
public static void StatePropertyCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
SwappableContentControl control = (SwappableContentControl)d;
if ((SwappableContentControlState)e.NewValue == SwappableContentControlState.Maximized)
{
control.Content = control.MaximizedContent;
}
else
{
control.Content = control.MinimizedContent;
}
}
public object MaximizedContent
{
get { return GetValue(MaximizedContentProperty); }
set { SetValue(MaximizedContentProperty, value); }
}
public object MinimizedContent
{
get { return GetValue(MinimizedContentProperty); }
set { SetValue(MinimizedContentProperty, value); }
}
public SwappableContentControlState State
{
get { return (SwappableContentControlState)GetValue(StateProperty); }
set { SetValue(StateProperty, value); }
}
public void SwapContent()
{
if (State == SwappableContentControlState.Maximized)
{
State = SwappableContentControlState.Normal;
}
else
{
State = SwappableContentControlState.Maximized;
}
}
}
}
Вот ссылка на проект: http://www.freewebs.com/thrash505/SwappingContentTest.zip
Пожалуйста, объясните немного больше, в чем проблема. И попытайтесь уменьшить весь этот код до чего-то более управляемого, есть такие файлы, как App.cs или весь код DependecyProperty, который можно удалить и сделать вашу проблему более понятной. –
Я уменьшил часть кода, надеюсь, что это поможет. Лучше всего загрузить проект и убедиться в этом сами. У меня есть ContentControl с двумя дополнительными свойствами контента; один для максимизации и один для минимизации. Я заменяю это содержимое на фактическое свойство Content во время выполнения.Но, так как там нет части фактического дерева при загрузке элемента управления, привязка не работает, как только я поменяю их во время выполнения. Мне нужно выяснить, как сделать их частью дерева, когда я поменяю ... Я думаю, что это проблема, но я могу ошибаться. – Thrash505
Любые идеи по этому поводу? – Thrash505