我已经成功地获得了一个单选按钮组功能,用于以下XAML:
<ScrollView>
<ListView ItemsSource="{Binding Devices}"
Style="{StaticResource ListViewSimpleStyle}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell x:DataType="local:DeviceEntryModel">
<RadioButton IsChecked="{Binding IsChecked, Mode=TwoWay}"
GroupName="Devices">
<RadioButton.Content>
<Label BindingContext="{Binding Source={RelativeSource AncestorType={x:Type RadioButton}}, Path=BindingContext}"
Text="{Binding Name}"
IsEnabled="{Binding Source={RelativeSource AncestorType={x:Type RadioButton}}, Path=IsEnabled}" />
</RadioButton.Content>
</RadioButton>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ScrollView>
有什么方法可以简化它并使其更易于重用吗?我正在考虑和最终结果看起来像这样:
<RadioButtonGroupView ItemSource="{Binding Devices}">
<RadioButtonGroupView.ItemTemplate>
<RadioButton IsChecked="{Binding IsChecked, Mode=TwoWay}"
x:DataType="local:Device"
GroupName="Devices">
<Label BindingContext="{Binding Source={RelativeSource AncestorType={x:Type RadioButton}}, Path=BindingContext}"
Text="{Binding Name}"
IsEnabled="{Binding Source={RelativeSource AncestorType={x:Type RadioButton}}, Path=IsEnabled}" />
</RadioButton>
</RadioButtonGroupView.ItemTemplate>
</RadioButtonGroupView>
一些类似的东西,一些更简单的东西,你明白要点了。谢谢!
我尝试了一些带有可绑定属性的东西,但不确定这是正确的方法。
是的,如果你想重用控件,你可以创建一个相对于BindableProperty
的ContentView
。
ChildView.xaml
<?xml version="1.0" encoding="utf-8" ?>
<ContentView xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiContentViewApp.ChildView"
x:Name="TestControlView"
>
<VerticalStackLayout>
<Label Text="{Binding Source={x:Reference TestControlView}, Path=YourName}"
VerticalOptions="Center"
HorizontalOptions="Center" />
<ListView ItemsSource="{Binding Source={x:Reference TestControlView}, Path=myViewModel.Items }" HasUnevenRows="True" >
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Label Text="{Binding FileName}" TextColor="#f35e20" VerticalOptions="Center"/>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</VerticalStackLayout>
</ContentView>
ChildView.xaml.cs
public partial class ChildView : ContentView
{
public String YourName
{
get
{
String value = (String)GetValue(YourNameProperty);
return value;
}
set
{
SetValue(YourNameProperty, value);
}
}
public static readonly BindableProperty YourNameProperty = BindableProperty.Create(nameof(YourName)
, typeof(String)
, typeof(ChildView), defaultBindingMode: BindingMode.TwoWay, propertyChanged: OnYourNameChanged);
static void OnYourNameChanged(BindableObject bindable, object oldValue, object newValue)
{
Console.WriteLine("-----------------> " + newValue);
}
//add MyViewModelProperty
public static readonly BindableProperty myViewModelProperty =
BindableProperty.Create(
nameof(myViewModel),
typeof(MyViewModel),
typeof(ChildView),
null);
public MyViewModel myViewModel
{
set { SetValue(myViewModelProperty, value); }
get { return (MyViewModel)GetValue(myViewModelProperty); }
}
public ChildView()
{
InitializeComponent();
}
}
更多细节,你可以检查线程我想从两个不同的视图绑定数据。
您可以查看文档BindableProperty获取更多信息。
您需要XAML和。cs部件。
在XAML中,你定义了你的ControlTemplate。把所有UI放在那里,或者使用TemplatedParent作为源,或者指定使用TemplateBinding。在。cs中,您创建控件的核心,继承ContentView,并编写您在XAML中使用的所有BindableProperties。(我假设Value和ItemSource是最小值)。
但是,我想让你考虑一下。如果你的模型是"Device",那么你的控件的可重用性应该如何?例如,如果你有一个让你从设备列表中选择的弹出窗口,在大多数情况下,弹出窗口是你可重用的部分,而不是单选按钮组。
只是当你做设计选择时需要考虑的东西。但是,没有什么可以阻止您创建自定义控件。