StackOverflowException для InitializeComponent - PullRequest
2 голосов
/ 19 октября 2010

Я пытаюсь следовать этому маленькому учебнику , но я продолжаю получать это исключение.

Соответствующий XAML выглядит так:

    <StatusBar Margin="0,288,0,0" Name="statusBar" Height="23" VerticalAlignment="Bottom">
        <StatusBar.DataContext>
            <m:MainWindow />
        </StatusBar.DataContext>
        <TextBlock Name="statusText" Text="{Binding Path=StatusBarText, NotifyOnTargetUpdated=True}" DataContext="{Binding}">
            <TextBlock.Triggers>
                <EventTrigger RoutedEvent="Binding.TargetUpdated">
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity">
                                <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                                <EasingDoubleKeyFrame KeyTime="0:0:0.25" Value="1"/>
                                <EasingDoubleKeyFrame KeyTime="0:0:4" Value="1"/>
                                <EasingDoubleKeyFrame KeyTime="0:0:5" Value="0"/>
                            </DoubleAnimationUsingKeyFrames>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </TextBlock.Triggers>
        </TextBlock>
    </StatusBar>

Я предполагаю, что получаю StackOverflowException, потому что пытаюсь использовать MainWindow в качестве DataContext. Я хочу использовать MainWindow, потому что это кажется логичным местом для размещения моего свойства StatusBarText,

public partial class MainWindow : Window
{
    public string StatusBarText { get; set; }

Это облегчает доступ к моим обработчикам событий с выделенным кодом.

Что мне тогда делать? Где я должен положить эту собственность? Или есть способ установить DataContext на «this», чтобы он не создавал новый экземпляр MainWindow и просто ссылался на себя?

Ответы [ 2 ]

3 голосов
/ 19 октября 2010

Я обычно устанавливаю свой DataContext в коде позади, в конструкторе (я обычно использую MVVM, но использую окно в небольших временных проектах):

public MainWindow()
{
    statusBar.DataContext = this;
}

Обратите внимание, что в показанном вами примере кода,вы получите только исходное значение StatusBarText, потому что вы не реализуете INotifyPropertyChanged.

1 голос
/ 19 октября 2010

В идеале ваши свойства, с которыми вы будете связывать, должны находиться внутри ViewModel, следуя шаблону MVVM, абстрагируясь от View.Так как это не ваш вопрос, однако мы будем двигаться дальше ... DataContext наследуется от его родителя.Поэтому, если StatusBar живет в Window, что, я уверен, так и есть, он уже будет наследовать DataContext из Window.По сути, вы пытаетесь связать компонент пользовательского интерфейса, используя компонент пользовательского интерфейса (Window) в качестве источника для DataContext.Далеко от идеала ... вот обзор шаблона MVVM ...

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