Обновление привязки свойства в silverlight - PullRequest
2 голосов
/ 24 июня 2011

Я пытаюсь обновить свойство, используя PropertyChangedEventHandler, но я думаю, что мое концептуальное понимание того, как это работает, может быть несколько ошибочным.Поскольку я новичок в WPF и silver-light.

Итак, позвольте мне объяснить, у меня есть свойство, которое установлено на 0, но через некоторое время поток внутренне изменяет значение с 0 на 9, нонесмотря на изменение значения, это свойство никогда не обновляется в реальном виде, и я не знаю почему!Даже после того, как я реализовал PropertyChangedEventHandler, никаких изменений не произошло, но если я зарегистрировал свойство, это показывает, что значение на самом деле равно 9

Итак, вот фрагмент кода, который реализует PropertyChangedEventHandler:

public class CustomColumn : IColumnViewable, INotifyPropertyChanged
{
    ...
    public event PropertyChangedEventHandler PropertyChanged = delegate { };
    public void OnPropertyChanged(string propertyName)
    {
        Foo.log.Error(": start on property change");
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        Foo.log.Error(": end on property change");
    }
    public static string _total;
    public string total { get { return _total; } set {  _total = value; OnPropertyChanged("total"); Foo.log.Error(": property change"); } }
    ...
}

Вот часть моего xaml:

<DataTemplate x:Key="ColumnView">
    <UserControl HorizontalAlignment="Stretch">
        <StackPanel HorizontalAlignment="Stretch">
            ...
            <RichTextBox Margin="5,2,5,2">
                <Paragraph>
                    <Run Text="{Binding Path=total, Mode=OneWay}" FontWeight="Bold" FontSize="30"  />
                    <Run Text=" total clicks" FontWeight="Bold" />
                </Paragraph>
            </RichTextBox>
           ...
            <ContentControl VerticalAlignment="Stretch" Content="{Binding Path=timeline}" ContentTemplate="{Binding Path=timelineView.ContentTemplate}" />
        </StackPanel>
    </UserControl> 
</DataTemplate>

И я делаю это при инициализации:

CustomColumn content = new CustomColumn();
content.total = "0";

И затем я передаю объект в поток, который при некоторомPoint делает это:

 content.total = "9";
 Foo.log.Error("value is "+content.total);

И свойство никогда не обновляется, и я не знаю почему - любая помощь очень ценится

Ответы [ 2 ]

1 голос
/ 25 июня 2011

Если я понимаю детали вашего вопроса, вы обновляете привязанное значение пользовательского интерфейса в фоновом потоке.Это необходимо сделать в потоке пользовательского интерфейса, иначе изменения не будут видны.В одном из наших приложений WPF случайные обновления исчезали до тех пор, пока мы не осознали это.

Мы выполняем много многопоточности в наших приложениях Silverlight (и WPF), поэтому, чтобы избежать этой проблемы, мы реализовали наш помощник по уведомлению вбазовый класс, как показано ниже (другие вещи обрезаны).Он отправляет все уведомления в основном потоке пользовательского интерфейса.Попробуйте:

public class ViewModelBase : INotifyPropertyChanged
{
    protected delegate void OnUiThreadDelegate();

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void SendPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            // Ensure property change is on the UI thread
            this.OnUiThread(() => this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)));
        }
    }

    protected void OnUiThread(OnUiThreadDelegate onUiThreadDelegate)
    {
        // Are we on the Dispatcher thread ?
        if (Deployment.Current.Dispatcher.CheckAccess())
        {
            onUiThreadDelegate();
        }
        else
        {
            // We are not on the UI Dispatcher thread so invoke the call on it.
            Deployment.Current.Dispatcher.BeginInvoke(onUiThreadDelegate);
        }
    }
}
0 голосов
/ 24 июня 2011

Ваш код не показывает, где вы делаете объект DataContext ваших элементов управления, который необходим для ваших привязок, которые не указывают другой источник и, следовательно, привязываются к DataContext.

CustomColumn content = new CustomColumn();
content.total = "0";

Есть ли у вас какая-либо строка после этого, где этот объект передается на ваш взгляд?

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