我的Combobox
中有一个UserControl
和两个按钮。是否可以将这些按钮设置为直接在XAML中更改Combobox
的所选索引?
我通过两种方法做到了这一点:
代码隐藏
private void nextBut_Click(object sender, RoutedEventArgs e)
{
combo.SelectedIndex++;
}
private void prevBut_Click(object sender, RoutedEventArgs e)
{
combo.SelectedIndex--;
}
或者通过将命令绑定到这些按钮并在我的ModelView
中定义该命令。
我还有另一个关于XAML的问题,我真的不知道是不是问了一个问题,或者利用这个机会你已经在读我了!我敢肯定它必须是直截了当的(至少对于这里的WPF大师):
我有ItemsControl
持有UserControl
,但可能有几个或没有(因为你可以创建更多,或删除)。我希望Checkbox
外部启用或不启用取决于我ItemsContol
中是否有元素(如果没有则禁用)。我认为这可以通过命令验证完成,但对我来说很难,因为我是这个世界的新手。这也可以通过代码隐藏完成,但我想避免它。 (比如定义绑定到Checkbox
的bool属性,就像写if(myItems.Count==0)
答案 0 :(得分:2)
对于复选框问题,它涉及将数量转换为bool的一般问题。规范的WPF答案将复选框IsChecked属性绑定到集合并通过IValueConverter路由它。这是一个转换器就可以做到......
public class QuantityToBoolConverter: IValueConverter
{
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
try
{
IEnumerable items = value as IEnumerable;
if (items != null)
{
return items.OfType<object>().Any();
}
}
catch
{
return value;
}
}
public object ConvertBack(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
return null;
}
}
要部署它,您需要在Xaml中将其声明为资源...
<Window.Resources>
<converters:QuantityToBoolConverter x:Key="QuantityToBoolConverter"/>
</Window.Resources>
然后将IsChecked属性绑定到您的项目并声明转换器...
<ListBox Name="mylb">
</ListBox>
<CheckBox IsChecked="{Binding ElementName=mylb, Path=ItemsSource, Converter={StaticResource
QuantityToBoolConverter}}"></CheckBox>
对于combobox SelectedIndex问题,您可以查看CollectionViewSource文档。 Here您可以在ViewModel中对此进行操作以移动当前选择。还有大量的示例代码需要检查。了解ICollectionView将很好地为您提供WPF开发人员。
答案 1 :(得分:2)
我宁愿将SelectedItem
属性绑定到ViewModel中的某个属性,并将这些按钮绑定到ViewModel中的某些命令。这种方式将状态数据(selectedItem)保存在ViewModel中,并可以使用它来执行所需的任何其他逻辑,从而消除了对代码的需求。
对于CheckBox,我宁愿在ViewModel中放置一个bool属性,并在添加/删除项目时通知它。
public bool HasItems {get {return Items.Any(); } }
public void AddItem()
{
//...Add Items
NotifyPropertyChanged("HasItems");
}
public void RemoveItem()
{
//...Remove Item
NotifyPropertyChanged("HasItems");
}
这消除了对额外转换器的需求。