Как изменить положение элемента управления в зависимости от выбранного значения ComboEdit во время выполнения в WPF?
У меня есть ComboEdit, который показывает список стран в нем. На форме есть вкладка АДРЕС, которая активируется при выборе значения ComboEdit. Положение элементов управления на вкладке ADDRESS должно быть изменено в соответствии с указанным макетом (мы можем использовать здесь базу данных для хранения макета в зависимости от выбранной страны) .
Я хочу отобразить формат адреса и элементы управления в соответствии с порядком, указанным для компании, выбранной из comboedit. Пожалуйста, см. Для различных форматов адресов: http://msdn.microsoft.com/en-us/library/cc195167.aspx.
Я хочу изменить позицию управления в соответствии с выбранной страной. Любое предложение / идея? В настоящее время я использую две разные сетки и делаю Visible/Hide в зависимости от значения страны. Это нормально для одной или двух стран, но невозможно добавить столько Grid, поэтому вы хотите сохранить его в базе данных. Пожалуйста, предложите мне правильный метод...!
<Grid Name="grdGroupA" Visibility="Hidden" Margin="0,0,95,21" HorizontalAlignment="Right" Width="714">
<Label Content="Honorific" HorizontalAlignment="Left" Margin="18,27,0,0" VerticalAlignment="Top"/>
<dxe:TextEdit Name="txtAHonorific" HorizontalAlignment="Left" Margin="134,31,0,0" VerticalAlignment="Top" RenderTransformOrigin="-1,0.091" Width="95" LostFocus="txtAHonorific_LostFocus"/>
<dxe:TextEdit Name="txtAFirstName" HorizontalAlignment="Left" Margin="309,31,0,0" VerticalAlignment="Top" Width="64" LostFocus="txtAFirstName_LostFocus"/>
<Label Content="First Name" HorizontalAlignment="Left" Margin="242,27,0,0" VerticalAlignment="Top"/>
<dxe:TextEdit Name="txtAMiddleName" Margin="0,31,185,0" VerticalAlignment="Top" HorizontalAlignment="Right" Width="64" LostFocus="txtAMiddleName_LostFocus"/>
<Label Content="Middle Name" HorizontalAlignment="Left" Margin="378,27,0,0" VerticalAlignment="Top"/>
<dxe:TextEdit Name="txtALastName" HorizontalAlignment="Right" Margin="0,31,35,0" VerticalAlignment="Top" Width="64" LostFocus="txtALastName_LostFocus"/>
<Label Content="Last Name" Margin="0,27,99,0" VerticalAlignment="Top" HorizontalAlignment="Right" Width="66" RenderTransformOrigin="-0.045,0.577"/>
<Label Content="Company Name" HorizontalAlignment="Left" Margin="18,58,0,0" VerticalAlignment="Top" Width="100"/>
<dxe:TextEdit Name="txtACompanyName" HorizontalAlignment="Left" Margin="134,58,0,0" VerticalAlignment="Top" RenderTransformOrigin="-1,0.091" Width="95"/>
<Label Content="Address1" HorizontalAlignment="Left" Margin="18,84,0,0" VerticalAlignment="Top" Width="59"/>
<dxe:TextEdit Name="txtAAddress1" HorizontalAlignment="Left" Margin="134,85,0,0" VerticalAlignment="Top" RenderTransformOrigin="-1,0.091" Width="95" LostFocus="txtAAddress1_LostFocus"/>
<Label Content="Address2" HorizontalAlignment="Left" Margin="18,108,0,0" VerticalAlignment="Top" Width="59"/>
<dxe:TextEdit Name="txtAAddress2" HorizontalAlignment="Left" Margin="134,112,0,0" VerticalAlignment="Top" RenderTransformOrigin="-1,0.091" Width="95" LostFocus="txtAAddress2_LostFocus"/>
<Label Content="City" HorizontalAlignment="Left" Margin="18,135,0,0" VerticalAlignment="Top" Width="59"/>
<dxe:TextEdit Name="txtACity" HorizontalAlignment="Left" Margin="134,139,0,0" VerticalAlignment="Top" RenderTransformOrigin="-1,0.091" Width="95" LostFocus="txtACity_LostFocus"/>
<Label Content="State" HorizontalAlignment="Left" Margin="242,135,0,0" VerticalAlignment="Top" Width="59"/>
<dxe:TextEdit Name="txtAState" HorizontalAlignment="Left" Margin="290,135,0,0" VerticalAlignment="Top" RenderTransformOrigin="-1,0.091" Width="95" LostFocus="txtAState_LostFocus"/>
<Label Content="Postal Code" HorizontalAlignment="Left" Margin="410,131,0,0" VerticalAlignment="Top" Width="77"/>
<dxe:TextEdit Name="txtAPostalCode" HorizontalAlignment="Left" Margin="487,131,0,0" VerticalAlignment="Top" RenderTransformOrigin="-1,0.091" Width="95" LostFocus="txtAPostalCode_LostFocus"/>
<Button Content="Save" Visibility="Hidden" Name="BtnASave" HorizontalAlignment="Left" Height="30" Margin="330,172,0,0" VerticalAlignment="Top" Width="75" Click="BtnASave_Click"/>
<Button Content="Cancel" Name="BtnACancel" HorizontalAlignment="Left" Height="30" Margin="492,172,0,0" VerticalAlignment="Top" Width="75" Click="BtnACancel_Click"/>
<Button Content="Update" Visibility="Hidden" x:Name="BtnAEdit" HorizontalAlignment="Left" Height="30" Margin="410,172,0,0" VerticalAlignment="Top" Width="75" Click="BtnAEdit_Click_1"/>
<Button Content="Add New" x:Name="BtnAAddNew" HorizontalAlignment="Left" Height="30" Margin="250,172,0,0" VerticalAlignment="Top" Width="75" Click="BtnAAddNew_Click"/>
<Label Content="*" x:Name="lblAHonorificError" Foreground="Red" HorizontalAlignment="Left" Margin="227,31,0,0" VerticalAlignment="Top"/>
<!--<Label Content="*" x:Name="lblAHonorificError_Copy" Foreground="Red" HorizontalAlignment="Left" Margin="227,57,0,0" VerticalAlignment="Top"/>-->
<Label Content="*" x:Name="lblAAddress1Error" Foreground="Red" HorizontalAlignment="Left" Margin="227,84,0,0" VerticalAlignment="Top"/>
<Label Content="*" x:Name="lblAAddress2Error" Foreground="Red" HorizontalAlignment="Left" Margin="226,112,0,0" VerticalAlignment="Top"/>
<Label Content="*" x:Name="lblACityError" Foreground="Red" HorizontalAlignment="Left" Margin="226,138,0,0" VerticalAlignment="Top"/>
<Label Content="*" x:Name="lblAStateError" Foreground="Red" HorizontalAlignment="Left" Margin="384,134,0,0" VerticalAlignment="Top"/>
<Label Content="*" x:Name="lblAPostalCodeError" Foreground="Red" HorizontalAlignment="Left" Margin="581,130,0,0" VerticalAlignment="Top"/>
<Label Content="*" x:Name="lblAFirstNameError" Foreground="Red" HorizontalAlignment="Left" Margin="370,30,0,0" VerticalAlignment="Top"/>
<Label Content="*" x:Name="lblAMiddleNameError" Foreground="Red" HorizontalAlignment="Left" Margin="529,31,0,0" VerticalAlignment="Top"/>
<Label Content="*" x:Name="lblALastNameError" Foreground="Red" HorizontalAlignment="Left" Margin="677,29,0,0" VerticalAlignment="Top"/>
</Grid>
<Grid Name="grdGroupB" Visibility="Visible" Margin="0,0,141,21" HorizontalAlignment="Right" Width="668">
<Label Content="Honorific" HorizontalAlignment="Left" Margin="18,27,0,0" VerticalAlignment="Top"/>
<dxe:TextEdit Name="txtBHonorific" HorizontalAlignment="Left" Margin="134,31,0,0" VerticalAlignment="Top" RenderTransformOrigin="-1,0.091" Width="95"/>
<dxe:TextEdit Name="txtBFirstName" HorizontalAlignment="Left" Margin="309,31,0,0" VerticalAlignment="Top" Width="64"/>
<Label Content="First Name" HorizontalAlignment="Left" Margin="242,27,0,0" VerticalAlignment="Top"/>
<dxe:TextEdit Name="txtBMiddleName" Margin="0,27,144,0" VerticalAlignment="Top" HorizontalAlignment="Right" Width="64"/>
<Label Content="Middle Name" HorizontalAlignment="Left" Margin="378,27,0,0" VerticalAlignment="Top"/>
<dxe:TextEdit Name="txtBLastName" HorizontalAlignment="Right" Margin="0,27,10,0" VerticalAlignment="Top" Width="64"/>
<Label Content="Last Name" Margin="0,27,73,0" VerticalAlignment="Top" HorizontalAlignment="Right" Width="66"/>
<Label Content="Company Name" HorizontalAlignment="Left" Margin="18,53,0,0" VerticalAlignment="Top" Width="100"/>
<dxe:TextEdit Name="txtBCompanyName" HorizontalAlignment="Left" Margin="134,58,0,0" VerticalAlignment="Top" RenderTransformOrigin="-1,0.091" Width="95"/>
<Label Content="Address1" HorizontalAlignment="Left" Margin="18,84,0,0" VerticalAlignment="Top" Width="59"/>
<dxe:TextEdit Name="txtBAddress1" HorizontalAlignment="Left" Margin="134,85,0,0" VerticalAlignment="Top" RenderTransformOrigin="-1,0.091" Width="95"/>
<Label Content="Address2" HorizontalAlignment="Left" Margin="18,108,0,0" VerticalAlignment="Top" Width="59"/>
<dxe:TextEdit Name="txtBAddress2" HorizontalAlignment="Left" Margin="134,112,0,0" VerticalAlignment="Top" RenderTransformOrigin="-1,0.091" Width="95"/>
<Label Content="City" HorizontalAlignment="Left" Margin="18,135,0,0" VerticalAlignment="Top" Width="59"/>
<dxe:TextEdit Name="txtBCity" HorizontalAlignment="Left" Margin="134,139,0,0" VerticalAlignment="Top" RenderTransformOrigin="-1,0.091" Width="95"/>
<Label Content="State" HorizontalAlignment="Left" Margin="250,58,0,0" VerticalAlignment="Top" Width="59"/>
<dxe:TextEdit Name="txtBState" HorizontalAlignment="Left" Margin="309,58,0,0" VerticalAlignment="Top" RenderTransformOrigin="-1,0.091" Width="64"/>
<Label Content="Postal Code" HorizontalAlignment="Left" Margin="378,58,0,0" VerticalAlignment="Top" Width="77"/>
<dxe:TextEdit Name="txtBPostalCode" HorizontalAlignment="Left" Margin="460,54,0,0" VerticalAlignment="Top" RenderTransformOrigin="-1,0.091" Width="64"/>
<Button Content="Save" Name="BtnBSave" HorizontalAlignment="Left" Height="30" Margin="412,172,0,0" VerticalAlignment="Top" Width="75"/>
<Button Content="Cancel" Name="BtnBCancel" HorizontalAlignment="Left" Height="30" Margin="492,172,0,0" VerticalAlignment="Top" Width="75"/>
</Grid>
Как и все элементы управления в Grid. Как установить положение в зависимости от выбранной страны?
Помощь приветствуется! Спасибо!
2 ответа
Ну, я не знаю, слишком ли поздно предложить вам следующее, но я бы предпочел подход с разными виртуальными машинами (по одной для каждой возможной страны), отражающий адресные данные. Затем вы можете создать для каждой страны DataTemplate
(по одному на каждый адрес вм). Следующее, что вам нужно, это TemplateSelector
который выбирает правильный DataTemplate
по ВМ перешел на него.
Это означает, что если адрес ВМ изменяется в соответствии с выбранной страной в ComboBox
, TemplateSelector
выбрал бы связанный DataTemplate
, При таком подходе вы можете легко расширить вашу заявку на дополнительные страны, если это необходимо.
Обратите внимание, что это решение учитывает шаблон MVVM (не уверен, что вы его используете) и что приведенный выше текст является лишь описанием моей идеи о том, как такое требование может быть реализовано. Возможно, вам придется решить некоторые проблемы, прежде чем быть успешным.
Для получения дополнительной информации, пожалуйста, перейдите по ссылкам
DataTemplates
TemplateSelector
- MVVM
Вот пример, который изменяет порядок отображения двух меток
XAML
<Window x:Class="WpfApplication1.JsonWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="JsonWindow" Height="300" Width="300"
>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock Text="Label 1" Grid.Row="{Binding label1}"/>
<TextBlock Text="Label 2" Grid.Row="{Binding label2}"/>
<Button Content="Change Position" Click="Button_Click" Grid.Row="2"/>
</Grid>
</Window>
Код позади
public partial class JsonWindow : Window, INotifyPropertyChanged {
public JsonWindow() {
InitializeComponent();
this.DataContext = this;
label1 = 0;
label2 = 1;
}
public int label1 {get;set;}
public int label2 { get; set; }
private void Button_Click(object sender, RoutedEventArgs e) {
label1 = 1;
label2 = 0;
PropertyChanged(this, new PropertyChangedEventArgs("label1"));
PropertyChanged(this, new PropertyChangedEventArgs("label2"));
}
public event PropertyChangedEventHandler PropertyChanged;
}
Но, как сказал @Novitchi S, вам придется покончить со своей техникой наценки. Используйте Grid.Row и Grid.Column.