Множественное использование UserControl

122
04 июля 2021, 21:00

Работаю с WPF с применением паттерна MVVM. Столкнулся с проблемой, создал UserControl(далее UC) один общий который будет несколько раз использоваться:

<UserControl x:Class="RecruiterWPF.View.UCSkypeView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:RecruiterWPF.View"
             xmlns:viewModel="clr-namespace:RecruiterWPF.ViewModel"
             mc:Ignorable="d" 
             d:DesignHeight="200" d:DesignWidth="300">
    <Grid>
        <Border BorderBrush="Black" BorderThickness="1" >
            <Grid Background="White" VerticalAlignment="Center" Margin="5,0">
                <Grid.RowDefinitions>
                    <RowDefinition></RowDefinition>
                    <RowDefinition></RowDefinition>
                    <RowDefinition></RowDefinition>
                    <RowDefinition></RowDefinition>
                    <RowDefinition></RowDefinition>
                    <RowDefinition></RowDefinition>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="100"></ColumnDefinition>
                    <ColumnDefinition Width="70"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <TextBlock Text="Логин аккаунта" Grid.Row="0" Grid.Column="0" />
                <TextBlock Text="{Binding LoginSkype}" Grid.Row="0" Grid.Column="1" TextAlignment="Center" VerticalAlignment="Center" />
                <TextBlock Text="Отправлено заявок в друзья" Grid.Row="1" Grid.Column="0" TextWrapping="Wrap" />
                <TextBlock Text="{Binding SkypeId}" Grid.Row="1" Grid.Column="1" TextAlignment="Center" VerticalAlignment="Center"/>
                <TextBlock Text="Создано диалогов" Grid.Row="2" Grid.Column="0" TextWrapping="Wrap"/>
                <TextBlock Text="{Binding DialogOnLabel}" Grid.Row="2" Grid.Column="1" TextAlignment="Center" VerticalAlignment="Center"/>
                <TextBlock Text="Положительные цепочки" Grid.Row="3" Grid.Column="0" TextWrapping="Wrap"/>
                <TextBlock Text="{Binding PositiveOnLabel}" Grid.Row="3" Grid.Column="1" TextAlignment="Center" VerticalAlignment="Center"/>
                <TextBlock Text="Отрицательные цепочки" Grid.Row="4" Grid.Column="0" TextWrapping="Wrap"/>
                <TextBlock Text="{Binding NegativeOnLabel}" Grid.Row="4" Grid.Column="1" TextAlignment="Center" VerticalAlignment="Center"/>
                <StackPanel Grid.Row="5" Grid.ColumnSpan="2" Grid.Column="0" Orientation="Horizontal">
                    <Button Command="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type ListBox}}, Path=DataContext.(viewModel:SkypeViewModel.EditCommand)}" Width="50">И</Button>
                    <Button Command="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type ListBox}}, Path=DataContext.(viewModel:SkypeViewModel.SaveCommand)}" Width="50">C</Button>
                    <Button Command="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type ListBox}}, Path=DataContext.(viewModel:SkypeViewModel.DeleteCommand)}" Width="50">У</Button>
                </StackPanel>
            </Grid>
        </Border>
    </Grid>
</UserControl>

На форме данный UserControl я вызываю в Listbox

<ListBox x:Name="SkLb" ItemsSource="{Binding Skypes}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" SelectedItem="{Binding SelectedSkype}">
                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <VirtualizingStackPanel IsItemsHost="True" Orientation="Horizontal"/>
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>
                <ListBox.ItemTemplate >
                    <DataTemplate>
                        <local:UCSkypeView></local:UCSkypeView>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

Всё верно я получаю так и должно быть(на дизайн не обращайте внимание я сейчас думаю о функциональности,И-изменить,С-сохранить,У-удалить).

Вот в чём проблема, как мне работать с одним UserControl-ом. Мне нужно чтобы при нажатии кнопки "И" в конкретном UC, данная кнопка становилась IsEnabled=false, а другие две становились активными(сейчас на скрине они активны), а при сохранение или удаление кнопки либо менялись снова либо удалялась UC с формы.

EditCommand = new RelayCommand(Edit,CanEdit);

Пробовал так менять состояние кнопки, но так меняются состояние всех кнопок, на всех UC. Что я делаю неправильно, направьте меня в нужном русле.

Answer 1

Можно объединить контролы в одной сетке и проходиться по всем, меняя свойство на True. Пример:

    private void Mouse_Down(object sender, MouseButtonEventArgs e)
    {
        IsEnabled = true;
        DependencyObject parent = VisualTreeHelper.GetParent(this);
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
        {
            var child = VisualTreeHelper.GetChild(parent, i);
            if (!this.Equals(child))
                try
                {
                    (child as MyControl).IsEnabled = false;
                }
                catch { }
        }
    }
READ ALSO
Можно ли создать &ldquo;составную&rdquo; переменную в c#. Например состоящую из byte,byte,string,string

Можно ли создать “составную” переменную в c#. Например состоящую из byte,byte,string,string

Чтоб к каждому члену этого списка соотвецвовало 2 переменные byte и 2 string

107
Как правильно оформить select запрос последней записи столбца

Как правильно оформить select запрос последней записи столбца

Как правильно оформить select-запрос в SQL, который берет только последнею запись со столбца finished?

82