Задать видимость UserControl'в через свойство

229
20 ноября 2017, 17:04

Пытаюсь изменить видимость Visibility через забинденое свойство к UserControl'у по нажатию кнопки, параллельно к этому свойству для проверки привязал другую кнопку. В итоге видимость кнопки изменяется а видимость UserControl'a нет. Как решить данную проблему?

Xaml MainUI

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Button
        Grid.Row="0"
        Height="40"
        Command="{Binding ClickCommand}"
        Content="Click" />
    <ucerControls:FirstUC Grid.Row="1" DataContext="{Binding FirstViewModel}" />
    <ucerControls:SecondUC
        Grid.Row="2"
        DataContext="{Binding SecondViewModel}"
        Visibility="{Binding Visible}" />
    <Button
        Grid.Row="3"
        Height="30"
        Content="{Binding Text}"
        Visibility="{Binding Visible}" />
</Grid>

MainViewModel.cs

public class MainViewModel:INotifyPropertyChanged
{
    #region PropertyChangedEventHandler
    /// <summary>
    /// Метод проверяющий изменилось ли свойство
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion
    private FirstViewModel _firstViewModel;
    private SecondViewModel _secondViewModel;
    private string _visible;
    public MainViewModel()
    {
        FirstViewModel=new FirstViewModel();
        SecondViewModel=new SecondViewModel();
        Visible = "Collapsed";
        ClickCommand = new Command(arg =>
        {
            Visible =(Visible=="Collapsed")?"Visible":"Collapsed";
        });
    }
    public FirstViewModel FirstViewModel
    {
        get { return _firstViewModel; }
        set { _firstViewModel = value; OnPropertyChanged("FirstViewModel");}
    }
    public SecondViewModel SecondViewModel
    {
        get { return _secondViewModel; }
        set { _secondViewModel = value; OnPropertyChanged("SecondViewModel");}
    }
    public string Visible
    {
        get { return _visible; }
        set { _visible = value; OnPropertyChanged("Visible"); }
    }
    public ICommand ClickCommand { get; set; }
}

В других UserControl'ах покрашен Background для видимости

Answer 1

По умолчанию привязка идет к DataContext, так как вы меняете его - вы должны явно указать источник привязки, например так:

Visibility="{Binding DataContext.Visible,
    RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"

Такая ситуация возникает достаточно часто, когда нужно привязаться не к своему DataContext, а к DataContext родительского окна, поэтому для упрощения разметки можно написать простое расширение разметки:

class ParentWindowBindingExtension : MarkupExtension
{
    public string Path { get; set; }
    public ParentWindowBindingExtension() { }
    public ParentWindowBindingExtension(string path)
    {
        Path = path;
    }
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return
            new Binding(Path)
            {
                RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor)
                {
                    AncestorType = typeof(Window)
                }
            }.ProvideValue(serviceProvider);
    }
}

Тогда наша привязка сократится до лаконичного:

Visibility="{ex:ParentWindowBinding DataContext.Visible}"

где ex - пространство имен с этим классом.

READ ALSO
Управление консолью Windows

Управление консолью Windows

Где найти информацию по управлению консолью на с, с#? Не такое управление, чтобы поменять цвет, или размер, а полноеНапример когда пишу игру,...

284
Не удается неявно преобразовать тип &ldquo;System.Drawing.Bitmap&rdquo; в &ldquo;string&rdquo;

Не удается неявно преобразовать тип “System.Drawing.Bitmap” в “string”

Обрабатываю изображения и вызываю метод RequestJson, он принимает url картинки и добавляет в dataGridView1, но RequestJson пишет Не удается неявно преобразовать...

374
Не могу разобраться с ошибками CS0501 CS0103

Не могу разобраться с ошибками CS0501 CS0103

Не могу разобраться с кодом у меня выскакивает ошибка CS0103 CS0103 The name 'cont_brick' does not exist in the current context то же самое относится и к "atimer"Прошу помощи

487
Клик по координатам c# wpf

Клик по координатам c# wpf

Нужно воспроизвести клик мышкой по заданным координатам, делаю так :

460