簡體   English   中英

WPF:是否可以綁定到userControl屬性的父級並將其DataContext設置為視圖模型?

[英]WPF: Is it possible to bind to a parent on userControl property and set its DataContext to a viewmodel?

我被困了一會兒,直到我發現為什么事情不起作用。 我正在基於Connected的值(這是SetupViewModel(parent)的一個屬性)更改兩個不同UserControl上的可見性。 這些用戶控件之一也將其DataContext設置為在SetupViewModel中創建的視圖模型。 但是,在還設置DataContext時,連接綁定不起作用。


這就是我希望它能工作的方式

<userControls:SessionSetupUserControl x:Name="SessionSetupUserControl" DataContext="{Binding SessionSetupViewModel}" Visibility="{Binding Connected, Mode=OneWay, Converter={StaticResource BoolToVis}, FallbackValue=Collapsed}" />

但是使用此功能時,“可見性”值將不會更新。


當我刪除DataContext時,可見性開始更新。

<userControls:SessionSetupUserControl x:Name="SessionSetupUserControl" Visibility="{Binding Connected, Mode=OneWay, Converter={StaticResource BoolToVis}, FallbackValue=Collapsed}" />

這是父級ViewModel。 僅顯示相關綁定。

public class SetupViewModel : BindableBase
{
    private bool _connected;

    public SessionSetupViewModel SessionSetupViewModel { get; private set; }

    public bool Connected
    {
        get
        {
            return _connected;
        }
        private set
        {
            SetPropertyAndNotifyChanges(ref _connected, value);
        }
    }
}

我認為在解析可見性綁定時,UserControl的DataContext發生了變化,但是我不習慣使用WPF或綁定,因此我無法使其正常運行。

非常感激任何的幫助。

您總是可以這樣綁定到控件的Parent元素的DataContext中的屬性:

Visibility="{Binding Parent.DataContext.Connected,
                     RelativeSource={RelativeSource Self},
                     Converter={StaticResource BoolToVis}}"

但是,您可以考慮采用另一種設計,即您的UserControl不直接綁定到顯式分配的DataContext。

控件可能會公開實例化綁定的依賴項屬性。 因此,它將變得獨立於任何特定的視圖模型。

<userControls:SessionSetupUserControl
    Visibility="{Binding Connected, Converter={StaticResource BoolToVis}}"
    SomeProperty="{Binding SessionSetupViewModel.SomeVmProperty}"
    SomeOtherProperty="{Binding SessionSetupViewModel.SomeOtherVmProperty}"
    .../>

綁定的另一種選擇是嵌套控件。

<UserControl Visibility="{Binding Connected, Mode=OneWay, Converter={StaticResource BoolToVis}, FallbackValue=Collapsed}" >

    <userControls:SessionSetupUserControl x:Name="SessionSetupUserControl" 
        DataContext="{Binding SessionSetupViewModel}" />

</UserControl>

這樣,外部泛型“ UserControl”直接與其自身綁定,並且可以根據您的轉換器可見/隱藏/折疊。

然后將內部用戶控件專門綁定到SessionSetupViewModel的數據上下文

由於您更改了SessionSetupUserControl實例的DataContext,因此其他綁定正嘗試在您分配的DataContext上解析。

這意味着您對Visibility的綁定正在SessionSetupViewModel上查找名為“ Connected”的屬性。

調試時請注意Visual Studio的輸出日志,您肯定會看到綁定錯誤,這幾乎說明了這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM