Определение DataContext из кода контроллера - PullRequest
0 голосов
/ 22 июня 2010

Я хочу определить DataContext моего окна из внешнего класса, чтобы иметь возможность использовать DI для моей модели данных.Я прочитал некоторые уроки об этом, но я все еще не могу заставить его работать вместе.Скажем, у нас есть простая модель данных:

class Data 
{
    public String Value { get; set; }

    public Data() 
    {
        Value = "Test";
    }
}

Когда я вписываю объект данных в код XAML, привязка данных работает правильно:

<Window ...>
  <Window.Resources>
    <src:Data x:Key="data" />
  </Window.Resources>
  <Window.DataContext>
    <Binding Source="{StaticResource ResourceKey=data}" />
  </Window.DataContext>
  <Grid>
    <Label Content="{Binding Path=Value}" />
  </Grid>
</Window>

Но если я пытаюсь связатьданные из внешнего класса, окно просто ничего не показывает, и я не получаю ошибку:

<Window ...>
  <Grid>
    <Label Content="{Binding Path=Value}" />
  </Grid>
</Window>

И основной класс:

class Test
{
    [@STAThreadAttribute()]
    public static void Main(string[] args)
    {
        MainWindow w = new MainWindow();

        Binding b = new Binding();
        b.Source = new Data();
        w.DataContext = b;

        w.ShowDialog();
    }
}

Я что-то упустил?Может быть, свойство DataContext должно быть установлено из другого потока?

1 Ответ

1 голос
/ 22 июня 2010

Вы можете установить Данные непосредственно в своем коде:

class Test
{
    [@STAThreadAttribute()]
    public static void Main(string[] args)
    {
        MainWindow w = new MainWindow();

        w.DataContext = new Data();

        w.ShowDialog();
    }
}

Или использовать Binding, и вы должны установить Binding по-другому в коде:

class Test
{
    [@STAThreadAttribute()]
    public static void Main(string[] args)
    {
        MainWindow w = new MainWindow();

        Binding b = new Binding();
        b.Source = new Data();
        SetBinding(DataContextProperty, b);

        w.ShowDialog();
    }
}

в вашемНапример, вы устанавливаете Binding как DataContext, что означает, что вы будете привязываться не к данным, а к самому объекту Binding.Если вы используете Xaml, он намеренно определит, используете ли вы привязку, и используете последнюю вместо первой!

Надеюсь, это поможет!

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