Пытаюсь изменить видимость 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
для видимости
По умолчанию привязка идет к 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
- пространство имен с этим классом.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Где найти информацию по управлению консолью на с, с#? Не такое управление, чтобы поменять цвет, или размер, а полноеНапример когда пишу игру,...
Обрабатываю изображения и вызываю метод RequestJson, он принимает url картинки и добавляет в dataGridView1, но RequestJson пишет Не удается неявно преобразовать...
Не могу разобраться с кодом у меня выскакивает ошибка CS0103 CS0103 The name 'cont_brick' does not exist in the current context то же самое относится и к "atimer"Прошу помощи