在xaml中设置父控件属性

时间:2012-08-10 10:07:07

标签: wpf xaml mvvm

我有一个自定义ListView的面板。 ListView's项目包含GroupBoxGroupBox包含ListView。这个ListView's项目包含GroupBox等等。

上面的所有控件都有自定义模板和样式

Controls VisualTree最低节点中有ToggleButtons。 检查这些按钮后,除了单击按钮外,我需要禁用所有面板。

我想避免在viewModel类中通过父级链接事件。

我正在使用mvvm模式,如果可能的话,我想在xaml方面解决它。

编辑:这是一个截图,而选择按钮应禁用面板

enter image description here

热烈欢迎任何建议。

2 个答案:

答案 0 :(得分:1)

你需要实现相似的源绑定,如下所示。

IsEnabled="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}},Path=IsEnabled}"

答案 1 :(得分:0)

在ViewModel中只有一个只读属性,它取决于你的ToggleButton所绑定的属性。

<强>视图模型:

private Boolean mSourceIsPicked;
public Boolean SourceIsPicked
{
    get { return mSourceIsPicked; }
    set 
    { 
        SetProperty("SourceIsPicked", ref mSourceIsPicked, value); 
        NotifyPropertyChanged("IsSourceChangeable");
    }
}

public Boolean IsSourceChangeable
{
    get { return ! this.SourceIsPicked; }
}

然后,在您的视图中,只需将其他控件的IsEnabled属性绑定到该新属性。

<ComboBox ItemsSource="{Binding SourceTypes}"
          IsEnabled={Binding IsSourceChangeable}" />

绑定到属性的优点是您可以在视图中添加/删除控件,只需绑定到此属性而无需更改其他XAML。您还可以通过 not 绑定到此属性来更改任何控件的行为。

如果您真的想要一个仅限XAML的解决方案,您可以为面板中的每个控件命名,并在&#34; SourceIsPicked&#34;上使用TargetName使用DataTrigger。禁用其他人的财产:

<ComboBox x:Name="cboSourceTypes" ... />
<ComboBox x:Name="cboSourceNames" ... />
<ToggleButton>
    <ToggleButton.Style>
        <Style TargetType="{x:Type ToggleButton}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding SourceIsPicked}" Value="True">
                    <Setter TargetName="cboSourceTypes" 
                            Property="IsEnabled" 
                            Value="False" />
                    <Setter TargetName="cboSourceNames" 
                            Property="IsEnabled" 
                            Value="False" />
                </DataTrigger>
            </Style.Triggers>
         </Style>
    </ToggleButton.Style>
</ToggleButton>

请注意,这都是徒手的,所以你可能需要稍微调整一下,但它会给你一个想法。