Как я могу связать данные в ListViewItem? - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть ListView с некоторыми столбцами.Один из столбцов содержит два RadioButton. Когда я проверял Radiobutton, я хочу изменить значение привязки последнего столбца (заголовок которого называется Fee). Понятия не имею, может кто-нибудь мне помочь?

<ListView x:Name="lvTimeView">
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn Header="ID" Width="175" DisplayMemberBinding="{Binding serverId}"></GridViewColumn>
                <GridViewColumn Header="IP" Width="175" DisplayMemberBinding="{Binding serverIp}"></GridViewColumn>
                <GridViewColumn x:Name="gvcTime" Header="Time" Width="400">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal" Height="30">
                                <RadioButton x:Name="rbOneMonth" Tag="1" Checked="rbChecked" Style="{StaticResource BoxRadioButton}" HorizontalAlignment="Left">OneMonth</RadioButton>
                                <RadioButton x:Name="rbTwoMonth" Tag="2" Margin="8,0,0,0" Checked="rbChecked" Style="{StaticResource BoxRadioButton}" HorizontalAlignment="Left">TwoMonth</RadioButton>
                            </StackPanel>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Fee" Width="100" DisplayMemberBinding="{Binding fee}">
                </GridViewColumn>
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>

1 Ответ

0 голосов
/ 21 декабря 2018

Во-первых, забудьте о событиях в этом примере.Это прекрасный пример для использования привязки WPF ...

Измените свой XAML на это.

<ListView ItemsSource="{Binding Items}">
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn Header="ID" Width="175" DisplayMemberBinding="{Binding ServerId}"></GridViewColumn>
                <GridViewColumn Header="IP" Width="175" DisplayMemberBinding="{Binding ServerIp}"></GridViewColumn>
                <GridViewColumn Header="Time">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <RadioButton GroupName="{Binding ServerId}" IsChecked="{Binding OneMonth}">OneMonth</RadioButton>
                                <RadioButton GroupName="{Binding ServerId}" IsChecked="{Binding TwoMonth}" Margin="5,0,0,0">TwoMonth</RadioButton>
                            </StackPanel>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Fee" Width="100" DisplayMemberBinding="{Binding Fee}">
                </GridViewColumn>
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>

Обратите внимание на свойство RadioButtons GroupName.Это просто, чтобы переключатели знали, что они являются частью группы переключателей, поэтому, когда вы выбираете одну, другая отменяет выбор.Мы должны установить что-то уникальное для каждой строки, поэтому я выбрал serverId.Я надеюсь, что это уникально в вашем случае, иначе вам придется сгенерировать какой-нибудь Guid или что-то ...

Далее идет модель ...

public class Item : INotifyPropertyChanged
{
    private string _serverId;
    private string _serverIp;
    private bool _oneMonth;
    private bool _twoMonth;
    private decimal _fee;

    public event PropertyChangedEventHandler PropertyChanged;

    public string ServerId
    {
        get => _serverId;
        set
        {
            _serverId = value;
            OnPropertyChanged(nameof(ServerId));
        }
    }
    public string ServerIp
    {
        get => _serverIp;
        set
        {
            _serverIp = value;
            OnPropertyChanged(nameof(ServerIp));
        }
    }
    public bool OneMonth
    {
        get => _oneMonth;
        set
        {
            _oneMonth = value;
            if(value)
                Fee = 100;
            OnPropertyChanged(nameof(OneMonth));
        }
    }
    public bool TwoMonth
    {
        get => _twoMonth;
        set
        {
            _twoMonth = value;
            if(value)
                Fee = 200;
            OnPropertyChanged(nameof(TwoMonth));
        }
    }
    public decimal Fee
    {
        get => _fee;
        set
        {
            _fee = value;
            OnPropertyChanged(nameof(Fee));
        }
    }
    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Создайте модель и добавьте ее вконтекст данных ...

public partial class MainWindow : Window
{
    public IEnumerable<Item> Items => new Item[]
    {
        new Item { ServerId = "asia", ServerIp = "10.1.1.45" },
        new Item { ServerId = "europe", ServerIp = "45.1.4.211" },
        new Item { ServerId = "australia", ServerIp = "37.2.1.181" }
    };

    public MainWindow()
    {
        InitializeComponent();

        DataContext = this;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...