【问题标题】:WPF: How to bind a Visibility property to an xaml element?WPF:如何将 Visibility 属性绑定到 xaml 元素?
【发布时间】:2013-09-30 09:23:53
【问题描述】:

我有一些问题需要帮助。我想将视图模型中的可见性属性绑定到 xaml 元素,因此只需更改视图模型中的值即可获得一些视觉上的更改(在本例中为折叠或显示)。

我得到了这个 xaml

<Window x:Class="PampelMuse.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:welcome="clr-namespace:PampelMuse.Views.Welcome"
    xmlns:backend="clr-namespace:PampelMuse.Views.Backend"
    xmlns:pampelMuse="clr-namespace:PampelMuse" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"
    Title="PampelMuse" Height="670" Width="864">
<Grid>
    <Image HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Source="Resources/Images/Backgrounds/4.jpg" Stretch="UniformToFill" />
    <welcome:WelcomeScreen x:Name="UIWelcome" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="{Binding ElementName=UiWelcomeVisibility}" />
    <backend:BackendUI x:Name="UIBackend" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Visibility="{Binding ElementName=UiBackendVisibility}" />
</Grid>

如您所见,可见性绑定到 UIModel 中的 UiWelcomeVisibilityUiBackendVisibility 属性。这些属性现在定义如下:

public partial class MainWindow : Window
{
    private ViewModel.ViewModel ViewModel = PampelMuse.ViewModel.ViewModel.GetInstance();

    public MainWindow()
    {
        InitializeComponent();

        DataContext = ViewModel; // Setting the data context what effects all the xaml elements in this component too, including UIWelcome and BackendUI

        ViewModel.UIModel.UiBackendVisibility = Visibility.Collapsed;
    }

视图模型:

public class ViewModel
{
    private static ViewModel instance = new ViewModel();
    public UIModel UIModel = UIModel.GetInstance();

    public static ViewModel GetInstance()
    {
        return instance;
    }
}

还有 UIModel:

public class UIModel
{
    private static UIModel instance = new UIModel();

    public Visibility UiWelcomeVisibility { get; set; }
    public Visibility UiBackendVisibility { get; set; }

    public static UIModel GetInstance()
    {
        return instance;
    }
}

我只是在这里看不到任何编码错误(实际上我在运行时也没有发现一些错误),但是 UIModel 的 UiBackendVisibility 并没有改变 BackendUI-visibility-property。

有什么想法吗?到目前为止,谢谢。

【问题讨论】:

    标签: c# wpf xaml binding viewmodel


    【解决方案1】:

    你做错了绑定。 Visibility="{Binding ElementName=UiWelcomeVisibility}" 将元素的可见性设置为 另一个名为“UiWelcomeVisibility”的可视元素。这样做有两个问题:

    1. 一开始就没有名为“UiWelcomeVisibility”的元素。
    2. 即使存在,视觉元素本身也不是Visibility 属性的有效值。

    您想要的是将数据绑定到视图模型。假设您已经将DataContext 设置为视图模型,只需使用

    <welcome:WelcomeScreen ... Visibility="{Binding UiWelcomeVisibility}" />
    

    【讨论】:

    • 好答案。你能补充一下这是Path=UiWelcomeVisibility的简写吗?
    • @Jon:感谢您的帮助。不幸的是,当我按照您的建议更改 Bindung 时,它说“由于未知数据上下文而无法解析符号 UiWelcomeVisibility”,尽管数据上下文是在构造函数中设置的,并且我知道 VS 在代码检查时编译构造函数。
    • @plain:设计者这么说(需要提一下的重要细节),这是合乎逻辑的,因为当您设计代码时,您的代码当然没有运行,所以有没有人设置数据上下文。它应该在运行时正常工作。
    • @Jon:好的,所以没有运行时错误,让我说,请注意此时无法找到数据上下文。但不幸的是,它并没有在运行时折叠 BackendUI,尽管我现在像 &lt;backend:BackendUI x:Name="UIBackend" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Visibility="{Binding Path=UiBackendVisibility}" /&gt; 一样制作了它,我可能忘记了其他东西吗?实际上,绑定实际上应该适用于您的更改。
    • @plain:你是否在视图模型上实现了INotifyPropertyChanged
    猜你喜欢
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 2023-04-04
    • 2018-05-14
    • 2013-10-04
    • 2011-07-03
    相关资源
    最近更新 更多