Как определить DataContext в XAML, используя StaticResource - PullRequest
7 голосов
/ 16 августа 2010

Я хочу объявить DataContext через статический ресурс в XAML в качестве привязки для клиентов в базе данных Northwind.Я могу сделать это легко в коде (C #), но хочу узнать, как это сделать в XAML.Я перепробовал все примеры, которые смог найти, но ни один из них не помог мне.Я полагаю, что проблема заключается в двух строках кода XAML, которые я обозначил [Option1] и [Option2].Можете ли вы уточнить, какой синтаксис для этого должен быть?

C #

namespace DataGridEF
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            bModel1 bNorthWind = new bModel1();
            //this.DataContext = bNorthWind;
            bNorthWind.GetCustomers();
        }
    }
}

namespace DataGridEF
{
    public class bModel1
    {
        List<Customer> _Customers;
        public List<Customer> Customers
        {
            get { return _Customers; }
            set { _Customers = value; }
        }

        public void GetCustomers()
        {
            NorthwindEntities NorthWind = new NorthwindEntities();
            var CustomerQ = from cust in NorthWind.Customers select cust;
            _Customers = CustomerQ.ToList();
        }

    }
}

XAML

 <Window x:Class="DataGridEF.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525"
    xmlns:vm="clr-namespace:DataGridEF">

<Window.Resources>
    <vm:bModel1 x:Key="TheViewModel" />
</Window.Resources>

<Grid>
    <DataGrid AutoGenerateColumns="False" Height="195" 
              HorizontalAlignment="Left" Margin="20,89,0,0" 
              Name="dataGrid1" ItemsSource="{Binding Path=Customers}" 
              [option1]DataContext="{StaticResource TheViewModel}"
              [option2]DataContext=
                  "{Binding Path=., Source={StaticResource TheViewModel}}"
              VerticalAlignment="Top" Width="471" >
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Path=ContactName}" />
            <DataGridTextColumn Header="Address" Binding="{Binding Path=Address}" />
            <DataGridTextColumn Header="City" Binding="{Binding Path=City}" />
        </DataGrid.Columns>
    </DataGrid>
</Grid>
</Window>

Ответы [ 2 ]

8 голосов

Если во избежание усложнения вопроса с Entities Framework и базой данных MSSQL NorthWind, хорошая иллюстрация приведена в примере кода CodeProject примера 2 " Краткое руководство по WPF / MVVM "

Для вашего XAML вы должны изменить его начало на:

<Window x:Class="DataGridEF.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525"
    xmlns:vm="clr-namespace:DataGridEF">

<Window.DataContext>
        <vm:bNorthWind />
    </Window.DataContext>
<Grid>
<!---Couldnt check your code due to dependencies on 
     EF and MSSQL NorthWind database

     See the reference for working illustration sample:
 http://www.codeproject.com/Articles/165368/WPF-MVVM-Quick-Start-Tutorial

-->
</Grid>
</Window>

Еще один вариант этого подхода можно увидеть в «В чем преимущество установки DataContext в коде вместо XAML?» , часть:

    <StackPanel.DataContext>
        <local:CustomerViewModel />
    </StackPanel.DataContext>   

Перенос определения DataContext из codebehind в XAML не связан с использованием StaticResource или DynamicResource. См .: В чем разница между StaticResource и DynamicResource в WPF? , вероятно, лучше рассматривать в codeproject WPF: StaticResource и DynamicResource

Связанное, полезное и дополнительное чтение:

1 голос
/ 24 апреля 2016

Я предпочитаю устанавливать ключ как статическую строку - в WPF достаточно магических строк, не загоняя себя в угол рефакторинга, если вы легко можете его избежать.

в App.xaml

xmlns:viewModels="clr-namespace:MyAppNamespace.ViewModels"
xmlns:local="clr-namespace:tvCADdesktop"
x:Name="App"
...
<viewModels:ApplicationViewModel x:Key= "{x:Static local:App.MainVmResourceKey}"/>

в App.xaml.cs

public static readonly string MainVmResourceKey = "MainVm";

по-разному Control.xaml

<UserControl.DataContext>
    <Binding>
        <Binding.Source>
            <StaticResource ResourceKey="{x:Static app:App.MainVmResourceKey}" />
        </Binding.Source>
    </Binding>
</UserControl.DataContext>

обратите внимание, что деталь UserControl относится к любому типу, к которому вы хотите применить ViewModel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...