모두 최근에 연결된 행의 메서드를 사용하여 선택한 행 (WPF DataGrid Column Becoming Corrupt when using Multi-Selection)이 스크롤되었을 때 DataGrid
의 비주얼이 업데이트되지 않는 문제가있었습니다 .선택한 RowCount를 TextBlock에 연결하지 않고 DataGrid 스크롤을 OnPropertyChanged하는 경우
나는 에 TextBlock
을 가지고 있으며 이것을 필요한 ViewModel의 IsSelected
속성에 연결합니다. 위의 질문에 대한 해결책은 선택한 행 수가 올바르게 업데이트되지 않았다는 사실도 해결할 것이라고 생각했습니다. 즉, DataGrid
스크롤 막대가 이동하지 않지만 막대가 이동하면 OnPropertyChanged
이벤트가 발생하지 않아 TextBlock
이 업데이트되지 않습니다. 나는 이것에 관해 많은 수표를 가지고 있고, 선택을 만드는 데 도움이 된 IsAsync=true
을 설정한다. (그것은이 업데이트 전에 1이었다.) 관련 XMAL는
<DataGrid Grid.Row="1" AlternatingRowBackground="Gainsboro" AlternationCount="2"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
AutoGenerateColumns="False" RowHeaderWidth="0" IsReadOnly="True"
CanUserAddRows="False" CanUserDeleteRows="False" SelectionMode="Extended"
EnableRowVirtualization="True" EnableColumnVirtualization="True"
ItemsSource="{Binding Cultures, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged, IsAsync=True}"
dataAccess:MultiSelectItem.IsEnabled="True">
<DataGrid.Columns>
<DataGridTextColumn Header="Code" Binding="{Binding Code}" IsReadOnly="True"/>
<DataGridTextColumn Header="Language" Binding="{Binding Language}" IsReadOnly="True"/>
<DataGridTextColumn Header="LocalName" Binding="{Binding LocalName}" IsReadOnly="True"/>
</DataGrid.Columns>
</DataGrid>
<StatusBar Grid.Row="1" Margin="0,0.4,0.4,-0.4">
<StatusBarItem DockPanel.Dock="Left" Background="#FF007ACC" Margin="0,2,0,0">
<TextBlock Text="{Binding TotalSelectedCultures}" Margin="5,0,0,0" Foreground="White"/>
</StatusBarItem>
</StatusBar>
인 경우이 링크는 DataGrid
스크롤, 어떻게이 정지 할 때 업데이트
public class CultureDataViewModel : ViewModelBase
{
public enum FilterType
{
AllCultures,
NeutralCultures,
SpecificCultures
};
public FilterType SelectedFilterType { get; private set; }
public ICollectionView CulturesView { get; private set; }
public MultiSelectCollectionView<CultureViewModel> Cultures { get; private set; }
public CultureDataViewModel()
{
SelectedFilterType = FilterType.AllCultures;
LoadCultures();
}
void OnCultureViewModelPropertyChanged(object sender, PropertyChangedEventArgs e)
{
string IsSelected = "IsSelected";
(sender as CultureViewModel).VerifyPropertyName(IsSelected);
if (e.PropertyName == IsSelected)
this.OnPropertyChanged("TotalSelectedCultures");
}
void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null && e.NewItems.Count != 0)
foreach (CultureViewModel cultVm in e.NewItems)
cultVm.PropertyChanged += this.OnCultureViewModelPropertyChanged;
if (e.OldItems != null && e.OldItems.Count != 0)
foreach (CultureViewModel cultVm in e.OldItems)
cultVm.PropertyChanged -= this.OnCultureViewModelPropertyChanged;
}
/// <summary>
/// Load the avalible cultures depending on filter selection
/// </summary>
public void LoadCultures()
{
// Get data...
}
/// <summary>
/// Hold the current total selected cultures to add to the resource
/// data set.
/// </summary>
public string TotalSelectedCultures
{
get
{
int selectedCultures = this.Cultures.SelectedItems.Count;
return String.Format("{0:n0} of {1:n0} cultures selected",
selectedCultures,
Cultures.Count);
}
}
}
TotalSelectedCultures
정거장 및 행 개수도에 표시 할 수 있도록 뷰 모델 이 경우?
감사합니다.
이렇게하면 MVVM 패턴이 깨집니다. – MoonKnight
자세히 설명해 주시겠습니까? 이 경우 ViewModel은 (자신의 뷰 모델 컬렉션 문화권) SelectedItems 속성 (이미보기에서 바인딩 됨)을 수신하고 TotalSelectedCultures가 변경되었음을 간단히 알립니다.이 속성에 바인딩 된 모든보기가 업데이트되도록합니다. – sfm