【问题标题】:Set parent controls property in xaml在 xaml 中设置父控件属性
【发布时间】:2012-08-10 10:07:06
【问题描述】:

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

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

在 Controls VisualTree 最低节点中有ToggleButtons。 当这些按钮被选中时,我需要禁用除单击按钮之外的所有面板。

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

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

编辑:这是一个屏幕截图,Pick 按钮应该禁用面板

热烈欢迎任何建议。

【问题讨论】:

  • 你能拍一张你的照片吗?

标签: wpf xaml mvvm


【解决方案1】:

您需要实现如下的相对源绑定。

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

【讨论】:

  • 这会将孩子绑定到父母的属性
【解决方案2】:

只需在您的 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 的解决方案,您可以命名面板中的每个控件,并使用 DataTrigger 在“SourceIsPicked”属性上使用 TargetName 来禁用其他控件:

<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>

请注意,这都是徒手画的,因此您可能需要稍微调整一下,但它给了您思路。

【讨论】:

  • 我有很多数据模板,所以无法使用 TargetName 属性。
  • @MiklósBalogh:那是使用属性的另一个论据。它将允许在整个应用程序中重用,如果(例如)有两个条件而不是一个条件,则允许您稍后更改功能,并且是一个非常简单的解决方案。它类似于中继命令的 CommandExecutable 属性。
猜你喜欢
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多