Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么WPF Window.Visibility绑定的属性必须为Mode=TwoWay';有人给他打电话吗?_C#_Wpf_Xaml_Data Binding - Fatal编程技术网

C# 为什么WPF Window.Visibility绑定的属性必须为Mode=TwoWay';有人给他打电话吗?

C# 为什么WPF Window.Visibility绑定的属性必须为Mode=TwoWay';有人给他打电话吗?,c#,wpf,xaml,data-binding,C#,Wpf,Xaml,Data Binding,视图模型: public FloatingToolbarWindowViewModel(GuiItems guiItems) { GuiItemsInstance = guiItems; GuiItemsInstance.Host = Host; GuiItemsInstance.RefreshVisibility = RefreshVisibility; } private Visibility _window

视图模型:

    public FloatingToolbarWindowViewModel(GuiItems guiItems)
    {

        GuiItemsInstance = guiItems;
        GuiItemsInstance.Host = Host;
        GuiItemsInstance.RefreshVisibility = RefreshVisibility;
    }

    private Visibility _windowVisibility;
    public Visibility WindowVisibility
    {
        get { return _windowVisibility; }
        set
        {
            //raises PropertyChanged-event
            SetValue(ref _windowVisibility, value);
        }
    }
    // this check if any of the toolbars should be in a window and then sets visibility
    public void RefreshVisibility(int RoleId)
    {
        if (GuiItemsInstance.ToolbarItems.Any(i => i.ToolbarLocation == ToolbarLocation.Float && i.RoleId == RoleId))
            WindowVisibility = Visibility.Visible;
        else
            WindowVisibility = Visibility.Hidden;
    }
XAML:

这意味着它永远无法工作,因为最终ShowWindow会将属性更新为可见,即使初始化“决定”它应该隐藏

因此,我所做的是对代码隐藏文件进行黑客攻击:

public partial class FloatingToolbarWindow : Window
{
    public FloatingToolbarWindow()
    {
        InitializeComponent();
        ContentRendered += FloatingToolbarWindow_ContentRendered;
    }

    private void FloatingToolbarWindow_ContentRendered(object sender, EventArgs e)
    {

        ((FloatingToolbarWindowViewModel)DataContext).RefreshWindowVisibility();
    }
ViewModel额外黑客方法:

    public void RefreshVisibility()
    {
        RefreshVisibility(GuiItemsInstance.ActiveRoleId);
    }

有没有一种方法可以做到这一点,而不是这个可怕的黑客。此外,Mode=one-way绑定在第一位时不应该这样做吗?

我将WindowVisibility设置为只读属性:

public Visibility WindowVisibility
{
        get 
        { 
         if (GuiItemsInstance.ToolbarItems.Any(i => i.ToolbarLocation == ToolbarLocation.Float && i.RoleId == RoleId))
        return Visibility.Visible;
    else
        return Visibility.Hidden;
    }
}
将可见性绑定为单向:

Visibility="{Binding WindowVisibility, Mode=OneWay}"
然后,每当你必须“更新”可见性时,只要提高属性更改。。。我也不知道你在用什么,可以吗

OnPropertyChanged("WindowVisibility");


什么是
SetValue(ref\u windowVisibility
?为什么不
SetValue(*.VisibilityProperty
?对不起,我使用的是这个抽象类ViewModel方法。它引发PropertyChanged事件。这会导致调用get,但只有在双向绑定时才调用。什么是“ShowWindow”?你是说Window.Show吗?再次抱歉,这是一个用于打开窗口的方法。它调用Window.Show,这在我的双向绑定中不好。我的示例非常糟糕,因为我使用的工具包,我认为双向是Window.Visibility绑定的正常情况,我问为什么必须这样。我的问题是不好的。我的问题被编辑以描述如何进行如果这能解释这里到底出了什么问题的话,我就把它破解了。我猜在代码的某个地方,在窗口的
Visibility
属性上有一个对
SetValue
的调用(setter就是这种情况)。这个方法的行为基于绑定模式——对于支持目标到源的模式(双向,单向到源)它更新源,而对于仅支持源到目标(单向,一次性)的模式,它仅用本地值替换绑定(绑定不再工作)。这就解释了它适用于双向绑定而不是单向绑定的事实。谢谢!如果问题是除非绑定是双向的,否则永远不会调用get,那么有什么解释说明这会起作用吗?抱歉,在引发事件时不调用get。
OnPropertyChanged("WindowVisibility");
OnPropertyChanged(() => WindowVisibility);