如何绑定到datacontext之外的内容

时间:2010-04-20 10:14:19

标签: wpf data-binding mvvm

我在WPF中有一个列表框,位于布局根目录中。

我也有一个在布局根目录中的框架。

列表框由具有字符串(Name)和框架元素(UI)的项组成。

如何将框架的内容绑定为列表框所选项目属性的UI属性?

如果您需要代码隐藏,您将如何在MVVM中执行此操作

2 个答案:

答案 0 :(得分:0)

听起来像是要显示所选对象的对象列表和详细信息。如果我是对的,MVVM中的解决方案可能会遵循:

<ListView ItemsSource="{Binding ObjectsList}" IsSynchronizedWithCurrentItem="True" />

<ContentControl Content="{Binding ObjectsList}">
    <ContentControl.ContentTemplate>
        <DataTemplate>
            <!-- details template -->
        </DataTemplate>
    </ContentControl.ContentTemplate>
</ContentControl> 

答案 1 :(得分:0)

我使用了ContentControl而不是Frame,因为我遇到了与Content属性绑定的问题,我从未在绑定更改后刷新它。我没有做适当的MVVM,数据不应该托管在视图中。

XAML:

<Window.Resources>
    <CollectionViewSource x:Key="CVS" Source="{Binding}" />
</Window.Resources>

<StackPanel DataContext="{Binding Source={StaticResource CVS}}">
    <ListBox
        ItemsSource="{Binding}"
        IsSynchronizedWithCurrentItem="True"
        DisplayMemberPath="Name">
    </ListBox>
    <ContentControl Content="{Binding Path=UI}" />
</StackPanel>

代码背后:

using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;

namespace BindDemo
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            Data = new List<DataItem>();
            Data.Add(new DataItem("TextBox", new TextBox(){ Text="hello" }));
            Data.Add(new DataItem("ComboBox", new ComboBox()));
            Data.Add(new DataItem("Slider", new Slider()));

            DataContext = Data;
        }

        public List<DataItem> Data
        {
            get; private set; 
        }
    }

    public class DataItem
    {
        public DataItem(string name, FrameworkElement ui)
        {
            Name = name;
            UI = ui;
        }

        public string Name { get; private set; }
        public FrameworkElement UI { get; private set; }
    }
}