CheckBox
にViewModelにすべてのチェックされたフィールドが確実に入力されるようにバインディングを設定する方法について、少し混乱します。私はいくつかのコードと説明を下部に記載しています。WPF TreeView CheckBox Binding - ViewModelにチェックボックスを設定する方法
私のXAMLファイルはのはTreeView.xaml
それを呼びましょう:TreeView.xaml.cs
public partial class MultipleColumnsSelectorView : UserControl
{
public MultipleColumnsSelectorView()
{
InitializeComponent();
}
private MultipleColumnsSelectorVM Model
{
get { return DataContext as MultipleColumnsSelectorVM; }
}
}
<TreeView x:Name="availableColumnsTreeView"
ItemsSource="{Binding Path=TreeFieldData, Mode=OneWay, Converter={StaticResource SortingConverter}, ConverterParameter='DisplayName.Text'}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate x:Uid="HierarchicalDataTemplate_1" ItemsSource="{Binding Path=Children, Mode=OneWay, Converter={StaticResource SortingConverter}, ConverterParameter='DisplayName.Text'}">
<CheckBox VerticalAlignment="Center" IsChecked="{Binding IsSelected, Mode=TwoWay}">
<TextBlock x:Uid="TextBlock_1" Text="{Binding DisplayName.Text, Mode=OneWay}" />
</CheckBox>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
"の背後にあるコードは" ViewModelにはMultipleColumnsSelectorVM
(のみ関連のものを含めることを試みた):
public partial class MultipleColumnsSelectorVM : ViewModel, IMultipleColumnsSelectorVM
{
public ReadOnlyCollection<TreeFieldData> TreeFieldData
{
get { return GetValue(Properties.TreeFieldData); }
set { SetValue(Properties.TreeFieldData, value); }
}
public List<TreeFieldData> SelectedFields
{
get { return GetValue(Properties.SelectedFields); }
set { SetValue(Properties.SelectedFields, value); }
}
private void AddFields()
{
//Logic which loops over SelectedFields and when done calls a delegate which passes
//the result to another class. This works, implementation hidden
}
を
モデルTreeFieldData
:
public class TreeFieldData : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public IEnumerable<TreeFieldData> Children { get; private set; }
private bool _isSelected;
public bool IsSelected
{
get { return _isSelected; }
set
{
_isSelected = value;
if (PropertyChanged != null)
PropertyChanged.Invoke(this, new PropertyChangedEventArgs("IsSelected"));
}
}
}
問題:
私が望む行動は、ユーザーがチェックボックスをチェックしたときに、それはTreeField
のIsSelected
プロパティを設定する必要がある(それは今のことを行います)が、その後、私はしたいですViewModelに戻り、TreeField
がSelectedFields
に追加されていることを確認してください。 PropertyChangedEvent.Invoke
が何を行い、誰がそのイベントを受け取るのか本当に分かりません。 SelectedFields
にデータが入力されるようにするには、AddFields()
が呼び出されたときに、チェックされたデータインスタンスがすべてTreeField
であることを確認しますか?
MultipleColumnsSelectorVMクラスには、TreeViewに表示されるTreeFieldDataオブジェクトのリストを返す "TreeFieldData"プロパティがあると思いますか? – mm8
@ mm8申し訳ありません、私は今それを含めました。 – DSF
@ mm8 FYI:TreeFieldDataプロパティには、含まれていないInitializeメソッドが設定されています。 – DSF