WPF, обновите TextBlock, когда CheckBox проверен - PullRequest
1 голос
/ 26 августа 2010

У меня есть TreeView, где у каждого элемента есть флажок. Я хочу, чтобы TextBlock обновлялся всякий раз, когда элемент отмечен или не отмечен в TreeView. * Text TextBlock должен быть привязан к свойству CheckedVersions в моем DataContext, чтобы при чтении свойства CheckedVersions получала строку, представляющую все отмеченные элементы в TreeView. Проверенные элементы должны быть представлены в строке через точку с запятой. Каков был бы лучший способ сделать это? У меня есть следующий XAML:

<XmlDataProvider Source="XmlData/Versions.xml" XPath="//*[count(*)=0]"
                 x:Key="versionsXml"
                 IsInitialLoadEnabled="True" IsAsynchronous="False" />
<HierarchicalDataTemplate x:Key="versionTemplate">
    <CheckBox Focusable="False" IsChecked="{Binding Path=IsChecked}"
              Content="{Binding Path=Name, Mode=OneTime}"/>
</HierarchicalDataTemplate>
<TreeView x:Name="trv_version"
          ItemsSource="{Binding Path=Versions, Mode=OneWay}"
          ItemTemplate="{StaticResource versionTemplate}" />
<TextBlock x:Name="txb_version" Text="{Binding Path=CheckedVersions}"
           TextWrapping="Wrap" />

Каждый элемент в моем TreeView является экземпляром моего VersionViewModel класса, который реализует INotifyPropertyChanged и уведомляет об изменении свойства IsChecked. Кажется, я должен быть в состоянии подключиться к этому, чтобы при изменении IsChecked на экземпляре VersionViewModel в обновлениях TreeView, CheckedVersions. Может быть, если я установлю UpdateSourceTrigger в привязке Text в TextBlock? Что мне установить, хотя?

1 Ответ

0 голосов
/ 26 августа 2010

Я думаю, что ваша древовидная модель должна «знать» все VersionViewModels, а затем все, что вам нужно сделать, - это зарегистрироваться на событие propertyloaded и установить свойство «CheckedVersions» в соответствии с изменением.

что-то в этом роде:

public class treeViewModel : INotifyPropertyChanged
{
    public List<VersionViewModel> CurrentVersionViewModel { get; protected set; }

    public void AddNewVersionViewModel(VersionViewModel vvm)
    {
        CurrentVersionViewModel.Add(vvm);
        vvm.PropertyChanged += new PropertyChangedEventHandler(
            (obj,propEventArgs) => 
                {
                if (propEventArgs.PropertyName=="IsChecked")
                {
                // CheckedVersions change logic according to the new value (this is just the concept)
                    CheckedVersions += (obj as VersionViewModel).IsChecked;
                }
                }
            );
    }

    public string CheckedVersions { get { return _CheckedVersions; } set { _CheckedVersions = value; RaisePropertyChanged("CheckedVersions"); } }
    private string _CheckedVersions;

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    public void RaisePropertyChanged(string prop)
    {
        if (PropertyChanged!=null)
        {
            PropertyChanged(this,new PropertyChangedEventArgs(prop));
        }
    }

    #endregion
}

public class VersionViewModel : INotifyPropertyChanged
{

    public bool IsChecked { get; set; }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}
...