如何从 ShellViewModel.cs 文件访问 ListBox 的 selectedItems?
How to access selectedItems of a ListBox from ShellViewModel.cs file?
所以这是我的问题:
我想使用另一个 class 的方法访问通过 Bindable Collection 绑定到 ListBox 的项目(及其属性)。 (外壳视图模型)
更准确地说:我想知道当前选择了此列表中的哪些项目。
我正在使用 C#,Caliburn.Micro 并且设计模式应该是 MVVM.
如果按下按钮 "Evaluate",根据所选的 ListBoxItems,将调用不同的方法。
所以 ShellView 中的 XAML-代码工作正常,"functional" 代码 "works",但如果我直接在 [=58] 中编码,它就可以工作=]-文件。 (大不,不)
因为我对这个主题很陌生,所以我尝试创建一个新的视图实例来访问,但这只会让我控制 ListBox 而没有 "knowing" 哪些项目是在原始实例中选择。
这里是通用的ListBox
<ListBox x:Name="MainListBox" ItemsSource="{Binding SCollection}"
Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="6" Grid.RowSpan="1"
SelectionMode="Multiple"
ScrollViewer.VerticalScrollBarVisibility="Visible"
ScrollViewer.HorizontalScrollBarVisibility="Visible"
MaxHeight="300" MinHeight="200" MaxWidth="340" Margin="5">
<ListBox.ItemTemplate>
<DataTemplate>
<Border Margin="0,5">
<StackPanel>
<TextBlock Text="{Binding Path=Name}" FontWeight="Bold" Padding="3,5,5,5" />
<TextBlock Text="{Binding Path=Info}" FontWeight="SemiBold" Padding="3,5,5,5" />
</StackPanel>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button x:Name="Evaluate" Background="Blue" Grid.Column="1" Grid.Row="7" MinWidth="80" Margin="5" Content="Test" Grid.ColumnSpan="1" />
所以这里有一些问题:
是否有类似的解决方案,例如通过 xaml 绑定 "SelectedItem",绑定到可访问的变量,用于多个选定的项目?(也许我只是错过了那里的东西?)
有没有办法访问 ListBox 的 "original" 实例(因此 "live"-selected Items)?
明确一点:
除了其他更好的解决方案之外,唯一的问题是,我希望绑定到按钮的调用方法 "Evaluate" 能够获得有关在我的 ListBox 中选择了哪些项目的丰富知识。
我相信我正确理解了您的担忧。要让 Evaluate 方法知道选择了哪些 Items,您可以采用以下策略。
在名为 IsSelected 的 Collection 类型中添加一个 boolean 属性,这将有助于跟踪选择的项目。例如,
public class Contact : PropertyChangedBase
{
public string Name { get; set; }
public string Info { get; set; }
public bool IsSelected { get; set; }
}
现在假设您的 Collection 定义如下。
public 可观察Collection SCollection { get;放; } = new ObservableCollection();
您可以按以下方式筛选评估方法中的选定项目。
public void Evaluate()
{
var selected = SCollection.Where(x => x.IsSelected);
}
更新
在列表框中选择期间,您需要将 IsSelected 属性 设置为 true。这可以按如下方式完成。
<ListBox x:Name="MainListBox" ItemsSource="{Binding SCollection}"
SelectionMode="Multiple"
ScrollViewer.VerticalScrollBarVisibility="Visible"
ScrollViewer.HorizontalScrollBarVisibility="Visible"
MaxHeight="300" MinHeight="200" MaxWidth="340" Margin="5">
<ListBox.ItemTemplate>
<DataTemplate>
<Border Margin="0,5">
<StackPanel>
<TextBlock Text="{Binding Path=Name}" FontWeight="Bold" Padding="3,5,5,5" />
<TextBlock Text="{Binding Path=Info}" FontWeight="SemiBold" Padding="3,5,5,5" />
</StackPanel>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
示例屏幕截图
所以这是我的问题:
我想使用另一个 class 的方法访问通过 Bindable Collection 绑定到 ListBox 的项目(及其属性)。 (外壳视图模型) 更准确地说:我想知道当前选择了此列表中的哪些项目。
我正在使用 C#,Caliburn.Micro 并且设计模式应该是 MVVM.
如果按下按钮 "Evaluate",根据所选的 ListBoxItems,将调用不同的方法。
所以 ShellView 中的 XAML-代码工作正常,"functional" 代码 "works",但如果我直接在 [=58] 中编码,它就可以工作=]-文件。 (大不,不)
因为我对这个主题很陌生,所以我尝试创建一个新的视图实例来访问,但这只会让我控制 ListBox 而没有 "knowing" 哪些项目是在原始实例中选择。
这里是通用的ListBox
<ListBox x:Name="MainListBox" ItemsSource="{Binding SCollection}"
Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="6" Grid.RowSpan="1"
SelectionMode="Multiple"
ScrollViewer.VerticalScrollBarVisibility="Visible"
ScrollViewer.HorizontalScrollBarVisibility="Visible"
MaxHeight="300" MinHeight="200" MaxWidth="340" Margin="5">
<ListBox.ItemTemplate>
<DataTemplate>
<Border Margin="0,5">
<StackPanel>
<TextBlock Text="{Binding Path=Name}" FontWeight="Bold" Padding="3,5,5,5" />
<TextBlock Text="{Binding Path=Info}" FontWeight="SemiBold" Padding="3,5,5,5" />
</StackPanel>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button x:Name="Evaluate" Background="Blue" Grid.Column="1" Grid.Row="7" MinWidth="80" Margin="5" Content="Test" Grid.ColumnSpan="1" />
所以这里有一些问题:
是否有类似的解决方案,例如通过 xaml 绑定 "SelectedItem",绑定到可访问的变量,用于多个选定的项目?(也许我只是错过了那里的东西?)
有没有办法访问 ListBox 的 "original" 实例(因此 "live"-selected Items)?
明确一点: 除了其他更好的解决方案之外,唯一的问题是,我希望绑定到按钮的调用方法 "Evaluate" 能够获得有关在我的 ListBox 中选择了哪些项目的丰富知识。
我相信我正确理解了您的担忧。要让 Evaluate 方法知道选择了哪些 Items,您可以采用以下策略。
在名为 IsSelected 的 Collection 类型中添加一个 boolean 属性,这将有助于跟踪选择的项目。例如,
public class Contact : PropertyChangedBase
{
public string Name { get; set; }
public string Info { get; set; }
public bool IsSelected { get; set; }
}
现在假设您的 Collection 定义如下。
public 可观察Collection SCollection { get;放; } = new ObservableCollection();
您可以按以下方式筛选评估方法中的选定项目。
public void Evaluate()
{
var selected = SCollection.Where(x => x.IsSelected);
}
更新
在列表框中选择期间,您需要将 IsSelected 属性 设置为 true。这可以按如下方式完成。
<ListBox x:Name="MainListBox" ItemsSource="{Binding SCollection}"
SelectionMode="Multiple"
ScrollViewer.VerticalScrollBarVisibility="Visible"
ScrollViewer.HorizontalScrollBarVisibility="Visible"
MaxHeight="300" MinHeight="200" MaxWidth="340" Margin="5">
<ListBox.ItemTemplate>
<DataTemplate>
<Border Margin="0,5">
<StackPanel>
<TextBlock Text="{Binding Path=Name}" FontWeight="Bold" Padding="3,5,5,5" />
<TextBlock Text="{Binding Path=Info}" FontWeight="SemiBold" Padding="3,5,5,5" />
</StackPanel>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
示例屏幕截图