2012-07-29 3 views
0

에서 ContentControl을하고 변환기를 사용하여 컨트롤을 만들어 실버 라이트 4에동적으로 silverlight4

내 요구 사항을 동적 컨트롤을 만들 수있는 문제가 있습니다 :

나는 다음과 같다 데이터베이스에 질문 테이블을 가지고있다.

QuestionText, AnswerControl, AnswerDefaultText, IsItmandatory


Question1 텍스트 상자 예 널

QuestionText2 경우 RadioButton, 예, 예

Question3, 콤보, 널, 아니

.. ........................................

이 데이터를 객체로 가져와 TextBlock에 질문 텍스트를 변환하고 answercontrol 값을 기반으로 컨트롤을 동적으로 만들어야합니다.

귀하의 게시물에서 언급 한대로 시도했지만 데이터가 바인딩되어 있지 않고 기본값을 매개 변수 값으로 변환 프로그램에 보낼 수 없습니다.

내 변환기가 호출되지 않습니다. 아래 코드에 어떤 문제가 있습니까?

내 코드는 다음과 같습니다

1) 내 XAML 코드 :

<UserControl x:Class="SilverlightApplication5.DynamicControls" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:local="clr-namespace:SilverlightApplication5.Converter" 
xmlns:question="clr-namespace:SilverlightApplication5" 
mc:Ignorable="d" 
d:DesignHeight="300" d:DesignWidth="400"> 

    <Grid x:Name="LayoutRoot" Background="White" Width="400" Height="400"> 
     <Grid.Resources> 
<local:UILocatorConverter x:Key="UILocatorConverter" /> 
<question:Questions x:Key="Questions"/> 
</Grid.Resources> 
<ListBox ItemsSource="{Binding Questions}" Width="400" Height="400"> 
<ListBox.ItemTemplate> 
<DataTemplate> 

<Grid> 
<Grid.ColumnDefinitions> 
<ColumnDefinition></ColumnDefinition> 
<ColumnDefinition></ColumnDefinition> 
</Grid.ColumnDefinitions> 

<ContentControl Content="{Binding Converter={StaticResource UILocatorConverter},ConverterParameter={Binding QuestionText},Path=QuestionControl}" Grid.Column="0" /> 
<ContentControl Content="{Binding Converter={StaticResource UILocatorConverter},ConverterParameter={Binding DefaultValue},Path=AnswerControl}" Grid.Column="1" /> 

</Grid> 

</DataTemplate> 
</ListBox.ItemTemplate> 
</ListBox> 
</Grid> 
</UserControl> 

2) 파일의 코드 뒤에 코드는 다음과 같습니다

namespace SilverlightApplication5 
{ 
public partial class DynamicControls : UserControl 
{ 
ObservableCollection<Questions> Question; 

public DynamicControls() 
{ 
InitializeComponent(); 

Question = new ObservableCollection<Questions>(); 
Question.Add(new Questions { QuestionControl = "TextBlock", QuestionText = "What is your name?", AnswerControl = "TextBox", AnswerValues = "", DefaultValue = "" }); 
Question.Add(new Questions { QuestionControl = "TextBlock", QuestionText = "What is your surname?", AnswerControl = "TextBox", AnswerValues = "", DefaultValue = "" }); 
Question.Add(new Questions { QuestionControl = "TextBlock", QuestionText = "Sex:", AnswerControl = "ComboBox", AnswerValues = "Male,Female,Others", DefaultValue = "Select a Value" }); 
Question.Add(new Questions { QuestionControl = "TextBlock", QuestionText = "Marital Status", AnswerControl = "RadioButton", AnswerValues = "", DefaultValue = "Not Married" }); 

this.DataContext = Question; 

} 

} 
} 

3) 내 계산기는 다음과 같습니다

namespace SilverlightApplication5.Converter 
{ 
public class UILocatorConverter : IValueConverter 
{ 


public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
String param="This is control created dynamically"; 
if (parameter != null) 
{ 
param = System.Convert.ToString(parameter); 
} 

switch (value.ToString()) 
{ 
case "TextBlock": 
return new TextBlock() { Text = param, HorizontalAlignment=HorizontalAlignment.Center,TextWrapping=TextWrapping.NoWrap,Width=200 }; 
case "Button": 
return new Button() { Content = param, Width=150 }; 
case "TextBox": 
return new TextBox() { Text = param }; 
case "RadioButton": 
return new TextBox() { }; 
case "ComboBox": 
return new TextBox() { }; 


} 

return null; 
} 

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
throw new NotImplementedException(); 
} 

} 
} 

4) 내 질문 클래스 :

namespace SilverlightApplication5 
{ 
public class Questions 
{ 


private string _questionControl; 
public string QuestionControl { 
get 
{ 
return _questionControl; 
} 
set 
{ 
_questionControl = value; 

} 
} 

private string _questionText; 
public string QuestionText 
{ 
get 
{ 
return _questionText; 
} 
set 
{ 
_questionText = value; 

} 
} 

private string _answerControl; 
public string AnswerControl 
{ 
get 
{ 
return _answerControl; 
} 
set 
{ 
_answerControl = value; 

} 
} 

private string _answerValues; 
public string AnswerValues 
{ 
get 
{ 
return _answerValues; 
} 
set 
{ 
_answerValues = value; 
} 
} 

private string _defaultValue; 
public string DefaultValue 
{ 
get 
{ 
return _defaultValue; 
} 
set 
{ 
_defaultValue = value; 
} 
} 

} 


} 

변환기가 호출되지 않고이 코드에 문제가 있습니까?

답변

0

당신은이를 사용할 필요가 :

<ListBox ItemsSource="{Binding}" Width="400" Height="400"> 

당신이 DataContext를 설정 질문의 컬렉션에 액세스하려는 것처럼.

당신이하고 있었던 일은 리소스에 하나의 질문 클래스를 만들고 그것을 사용하도록 ListBox에 알려주는 것이 었습니다.

그래서 당신은 모든이 필요하지 않습니다 :

<question:Questions x:Key="Questions"/> 

(당신은 당신이 컬렉션에 DataContext를 설정하고 있기 때문에 직접 ... 그에 잘못 될 수 ... BindsDirectlyToSource을 사용해야 할 수도 있습니다!).

public partial class DynamicControls : UserControl 
{ 
    public ObservableCollection<Questions> Question { get; set; } 
    ... 

이런 방식으로 DataContext를 설정합니다 :

양자 택일로, 당신은 당신의 통제에서이 작업을 수행 할 수 있습니다

DataContext = this; 

그리고이 바인딩을 사용 :

<ListBox ItemsSource="{Binding Question}" Width="400" Height="400"> 

나 '를 질문 클래스로 이름을 바꾸고 혼동을 피하기 위해 속성 이름을 질문으로 변경하는 것이 좋습니다.