【问题标题】:Logical container in WPF to bind dataWPF中用于绑定数据的逻辑容器
【发布时间】:2012-04-20 14:27:36
【问题描述】:

我想将一个数据绑定到多个控件。 WPF 中是否有一些逻辑控制来实现这一点? 例如我有一个Grid

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <TextBlock Text="{Binding Name}" />
    <Button Grid.Column="1" Grid.RowSpan="2" IsEnabled="{Binding IsSimulationRunning}" />
    <controls:PlayerControl Grid.Row="1" IsEnabled="{Binding IsLoaded}" />
</Grid>

我想将TextBlock 绑定到一个数据,将ButtonPlayerControl 绑定到另一个数据,如下所示:

<Container DataContext="{Binding Object2}">
    <Button IsEnabled="{Binding IsSimulationRunning}" />
    <controls:PlayerControl IsEnabled="{Binding IsLoaded}" />
</Container>

我怎样才能以最好的方式做到这一点?

【问题讨论】:

    标签: wpf data-binding controls


    【解决方案1】:

    绑定绑定到包含依赖属性的元素的 DataContext。您可以将 DataContext 绑定到底层视图模型:

    <TextBlock DataContext="{Binding Object1}" Text="{Binding Name}" />
    <Button Grid.Column="1" Grid.RowSpan="2" 
        DataContext="{Binding Object2}" IsEnabled="{Binding IsSimulationRunning}" />
    <controls:PlayerControl Grid.Row="1" 
        DataContext="{Binding Object2}" IsEnabled="{Binding IsLoaded}" />
    

    如果您的视图模型如下所示:

    public class PlayerViewModel {        
        public TrackViewModel Object1 { get; set; }
        public PlaybackViewModel Object2 { get; set; }
    }
    public class TrackViewModel { public string Name { get; set; } }
    public class PlaybackViewModel { 
        public bool IsLoaded { get; set; } 
        public bool IsSimulationRunning { get; set; }
    }
    

    在这种情况下,您可以直接绑定到对象。要点是您需要在 1 个公共视图模型中拥有这两个对象。

    <TextBlock Text="{Binding Path=Object1.Name}" />
    <Button Grid.Column="1" Grid.RowSpan="2" IsEnabled="{Binding Path=Object2.IsSimulationRunning}" />
    <controls:PlayerControl Grid.Row="1" IsEnabled="{Binding Path=Object2.IsLoaded}" />
    

    【讨论】:

    • 感谢您的回答 (+1),但我想到了一个让不要写两次(或更多)语句 DataContext="{Binding Object2}" 的决定(请参阅帖子中的更改)
    猜你喜欢
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多